diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4575c4d69..57e59161cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,6 +42,7 @@ jobs: - "haplotypecaller" - "manta" - "markduplicates" + - "mpileup" - "msisensorpro" - "mutect2" - "prepare_recalibration" diff --git a/CHANGELOG.md b/CHANGELOG.md index 6797e4bb50..bdc8e1fc87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#551](https://github.com/nf-core/sarek/pull/551) - Sync `TEMPLATE` with `tools` `2.4` - [#562](https://github.com/nf-core/sarek/pull/562) - Restart from `--step annotate` is now also requiring a CSV file. - [#563](https://github.com/nf-core/sarek/pull/563) - Updated subway map +- [#570](https://github.com/nf-core/sarek/pull/570) - Extract mpileup into its own subworkflow; zip mpileup files - [#571](https://github.com/nf-core/sarek/pull/571) - Including and using GATK4's mergeVcfs - [#572](https://github.com/nf-core/sarek/pull/572) - Adjusted subway map svg for firefox compatibility - [#578](https://github.com/nf-core/sarek/pull/578) - Updated module deeptools/bamcoverage diff --git a/conf/modules.config b/conf/modules.config index ab4affec1b..1deca131d3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -682,11 +682,11 @@ process{ ] } - withName: 'CAT_MPILEUP_.*' { + withName: 'CAT_MPILEUP' { publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/variant_calling/${meta.id}/controlfreec" }, - pattern: "*mpileup" + path: { "${params.outdir}/variant_calling/${meta.id}/mpileup" }, + pattern: "*{mpileup.gz}", ] } @@ -758,14 +758,13 @@ process{ ] } - withName: 'MPILEUP_.*' { - ext.prefix = { meta.num_intervals <= 1 ? meta.id : "${meta.id}_${intervals.simpleName}"} - ext.when = { params.tools && params.tools.contains('controlfreec') } + withName: 'SAMTOOLS_MPILEUP' { + ext.when = { params.tools && (params.tools.contains('controlfreec') || params.tools.contains('mpileup')) } publishDir = [ mode: params.publish_dir_mode, - path: { "${params.outdir}/variant_calling/${meta.id}/" }, - pattern: "*mpileup", - saveAs: { meta.num_intervals > 1 ? null : "controlfreec/${it}" } + path: { "${params.outdir}/variant_calling/${meta.id}/mpileup" }, + pattern: "*mpileup.gz", + saveAs: { meta.num_intervals > 1 ? null : it } ] } @@ -910,20 +909,36 @@ process{ } //CONTROLFREEC - withName: 'MPILEUP_NORMAL' { - ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } + withName: 'NFCORE_SAREK:SAREK:PAIR_VARIANT_CALLING:RUN_MPILEUP_NORMAL:SAMTOOLS_MPILEUP' { + ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } + } + + withName: 'NFCORE_SAREK:SAREK:PAIR_VARIANT_CALLING:RUN_MPILEUP_TUMOR:SAMTOOLS_MPILEUP' { + ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.tumor" : "${meta.id}_${intervals.simpleName}.tumor" } + } + + withName: 'NFCORE_SAREK:SAREK:PAIR_VARIANT_CALLING:RUN_MPILEUP_NORMAL:CAT_MPILEUP' { + ext.prefix = { "${meta.id}.normal.mpileup.gz" } + } + + withName: 'NFCORE_SAREK:SAREK:PAIR_VARIANT_CALLING:RUN_MPILEUP_TUMOR:CAT_MPILEUP' { + ext.prefix = { "${meta.id}.tumor.mpileup.gz" } } - withName: 'MPILEUP_TUMOR' { - ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.tumor" : "${meta.id}_${intervals.simpleName}.tumor" } + withName: 'NFCORE_SAREK:SAREK:TUMOR_ONLY_VARIANT_CALLING:RUN_MPILEUP:CAT_MPILEUP' { + ext.prefix = { "${meta.id}.tumor.mpileup.gz" } } - withName: 'CAT_MPILEUP_NORMAL' { - ext.prefix = { "${meta.id}.normal.mpileup" } + withName: 'NFCORE_SAREK:SAREK:GERMLINE_VARIANT_CALLING:RUN_MPILEUP:SAMTOOLS_MPILEUP' { + ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.normal" : "${meta.id}_${intervals.simpleName}.normal" } } - withName: 'CAT_MPILEUP_TUMOR' { - ext.prefix = { "${meta.id}.tumor.mpileup" } + withName: 'NFCORE_SAREK:SAREK:GERMLINE_VARIANT_CALLING:RUN_MPILEUP:CAT_MPILEUP' { + ext.prefix = { "${meta.id}.normal.mpileup.gz" } + } + + withName: 'NFCORE_SAREK:SAREK:TUMOR_ONLY_VARIANT_CALLING:RUN_MPILEUP:SAMTOOLS_MPILEUP' { + ext.prefix = { meta.num_intervals <= 1 ? "${meta.id}.tumor" : "${meta.id}_${intervals.simpleName}.tumor" } } withName: 'FREEC_SOMATIC'{ @@ -972,6 +987,7 @@ process{ pattern: "*{bed,cnn,cnr,cns,pdf,png}" ] } + //FREEBAYES withName: 'NFCORE_SAREK:SAREK:PAIR_VARIANT_CALLING:RUN_FREEBAYES_SOMATIC:FREEBAYES' { ext.args = "--pooled-continuous \ diff --git a/docs/images/sarek_subway.png b/docs/images/sarek_subway.png index a17d702ae9..3cd8f13802 100644 Binary files a/docs/images/sarek_subway.png and b/docs/images/sarek_subway.png differ diff --git a/docs/images/sarek_subway.svg b/docs/images/sarek_subway.svg index 8b290c954a..734168a8f3 100644 --- a/docs/images/sarek_subway.svg +++ b/docs/images/sarek_subway.svg @@ -7,9 +7,9 @@ viewBox="0 0 297 210" version="1.1" id="svg5" - inkscape:version="1.2 (dc2aedaf03, 2022-05-15)" - sodipodi:docname="sarek_subway_orig_new.svg" - inkscape:export-filename="inkscape_subway_orig_new.90dpi.png" + inkscape:version="1.2 (dc2aeda, 2022-05-15)" + sodipodi:docname="sarek_subway.svg" + inkscape:export-filename="sarek_subway.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -26,13 +26,13 @@ inkscape:pagecheckerboard="false" inkscape:document-units="mm" showgrid="true" - inkscape:zoom="0.798645" - inkscape:cx="688.66643" - inkscape:cy="380.64472" - inkscape:window-width="1920" - inkscape:window-height="1000" - inkscape:window-x="-11" - inkscape:window-y="-11" + inkscape:zoom="7.7830401" + inkscape:cx="491.64593" + inkscape:cy="410.95766" + inkscape:window-width="1024" + inkscape:window-height="587" + inkscape:window-x="0" + inkscape:window-y="25" inkscape:window-maximized="1" inkscape:current-layer="layer4" width="211mm" @@ -42,7 +42,7 @@ fit-margin-bottom="0" lock-margins="false" units="mm" - inkscape:showpageshadow="2" + inkscape:showpageshadow="false" inkscape:deskcolor="#d1d1d1"> + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3.91732;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" /> deepvariant freebayes haplotypecaller freebayes + + + + + + Example analysis pathways @@ -3215,6 +3247,36 @@ sodipodi:nodetypes="ccsscccccccccc" style="fill:#ffffff;stroke-width:0.435688" /> + mpileup + mpileup diff --git a/modules.json b/modules.json index 0c330b13f3..36dff42a66 100644 --- a/modules.json +++ b/modules.json @@ -205,7 +205,7 @@ "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/mpileup": { - "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + "git_sha": "24e05f6097a5dde57dd80d33295ed120f1b81aef" }, "samtools/stats": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" diff --git a/modules/nf-core/modules/samtools/mpileup/main.nf b/modules/nf-core/modules/samtools/mpileup/main.nf index fcd498becb..cfab5c981c 100644 --- a/modules/nf-core/modules/samtools/mpileup/main.nf +++ b/modules/nf-core/modules/samtools/mpileup/main.nf @@ -11,8 +11,8 @@ process SAMTOOLS_MPILEUP { path fasta output: - tuple val(meta), path("*.mpileup"), emit: mpileup - path "versions.yml" , emit: versions + tuple val(meta), path("*.mpileup.gz"), emit: mpileup + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -27,6 +27,7 @@ process SAMTOOLS_MPILEUP { --output ${prefix}.mpileup \\ $args \\ $input + bgzip ${prefix}.mpileup cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/subworkflows/local/germline_variant_calling.nf b/subworkflows/local/germline_variant_calling.nf index e29e48d874..ee0d45c726 100644 --- a/subworkflows/local/germline_variant_calling.nf +++ b/subworkflows/local/germline_variant_calling.nf @@ -7,6 +7,7 @@ include { RUN_DEEPVARIANT } from '../nf-core/variantcalling/deepvariant/main include { RUN_FREEBAYES } from '../nf-core/variantcalling/freebayes/main.nf' include { RUN_HAPLOTYPECALLER } from '../nf-core/variantcalling/haplotypecaller/main.nf' include { RUN_MANTA_GERMLINE } from '../nf-core/variantcalling/manta/germline/main.nf' +include { RUN_MPILEUP } from '../nf-core/variantcalling/mpileup/main' include { RUN_STRELKA_SINGLE } from '../nf-core/variantcalling/strelka/single/main.nf' include { RUN_TIDDIT } from '../nf-core/variantcalling/tiddit/main.nf' @@ -39,6 +40,7 @@ workflow GERMLINE_VARIANT_CALLING { manta_vcf = Channel.empty() strelka_vcf = Channel.empty() tiddit_vcf = Channel.empty() + mpileup = Channel.empty() // Remap channel with intervals cram_recalibrated_intervals = cram_recalibrated.combine(intervals) @@ -63,6 +65,18 @@ workflow GERMLINE_VARIANT_CALLING { cram, crai, bed_new, tbi_new] } + if(params.tools.contains('mpileup')){ + cram_intervals_no_index = cram_recalibrated_intervals + .map { meta, cram, crai, intervals -> + [meta, cram, intervals] + } + + RUN_MPILEUP(cram_intervals_no_index, + fasta) + mpileup_germline = RUN_MPILEUP.out.mpileup + ch_versions = ch_versions.mix(RUN_MPILEUP.out.versions) + } + // CNVKIT if(tools.contains('cnvkit')){ diff --git a/subworkflows/local/pair_variant_calling.nf b/subworkflows/local/pair_variant_calling.nf index ee9a0b4b05..49d0723d23 100644 --- a/subworkflows/local/pair_variant_calling.nf +++ b/subworkflows/local/pair_variant_calling.nf @@ -8,6 +8,8 @@ include { RUN_FREEBAYES as RUN_FREEBAYES_SOMATIC } from '../nf-core/variantca include { RUN_MANTA_SOMATIC } from '../nf-core/variantcalling/manta/somatic/main.nf' include { RUN_STRELKA_SOMATIC } from '../nf-core/variantcalling/strelka/somatic/main.nf' include { RUN_CNVKIT_SOMATIC } from '../nf-core/variantcalling/cnvkit/somatic/main.nf' +include { RUN_MPILEUP as RUN_MPILEUP_NORMAL } from '../nf-core/variantcalling/mpileup/main' +include { RUN_MPILEUP as RUN_MPILEUP_TUMOR } from '../nf-core/variantcalling/mpileup/main' workflow PAIR_VARIANT_CALLING { take: @@ -73,9 +75,18 @@ workflow PAIR_VARIANT_CALLING { .map {meta, normal_cram, normal_crai, tumor_cram, tumor_crai, intervals -> [meta, tumor_cram, intervals] } - - RUN_CONTROLFREEC_SOMATIC(cram_normal_intervals_no_index, - cram_tumor_intervals_no_index, + RUN_MPILEUP_NORMAL(cram_normal_intervals_no_index, fasta) + mpileup_normal = RUN_MPILEUP_NORMAL.out.mpileup + RUN_MPILEUP_TUMOR(cram_tumor_intervals_no_index, fasta) + mpileup_tumor = RUN_MPILEUP_TUMOR.out.mpileup + ch_versions = ch_versions.mix(RUN_MPILEUP_NORMAL.out.versions) + ch_versions = ch_versions.mix(RUN_MPILEUP_TUMOR.out.versions) + + controlfreec_input = mpileup_normal.cross(mpileup_tumor) + .map{ normal, tumor -> + [normal[0], normal[1], tumor[1], [], [], [], []] + } + RUN_CONTROLFREEC_SOMATIC(controlfreec_input, fasta, fasta_fai, dbsnp, diff --git a/subworkflows/local/tumor_variant_calling.nf b/subworkflows/local/tumor_variant_calling.nf index 2ef58e26e3..0d12f83702 100644 --- a/subworkflows/local/tumor_variant_calling.nf +++ b/subworkflows/local/tumor_variant_calling.nf @@ -9,6 +9,7 @@ include { RUN_MANTA_TUMORONLY } from '../nf-core/variantcall include { RUN_STRELKA_SINGLE } from '../nf-core/variantcalling/strelka/single/main.nf' include { RUN_CONTROLFREEC_TUMORONLY } from '../nf-core/variantcalling/controlfreec/tumoronly/main.nf' include { RUN_CNVKIT_TUMORONLY } from '../nf-core/variantcalling/cnvkit/tumoronly/main.nf' +include { RUN_MPILEUP } from '../nf-core/variantcalling/mpileup/main' workflow TUMOR_ONLY_VARIANT_CALLING { take: @@ -62,12 +63,23 @@ workflow TUMOR_ONLY_VARIANT_CALLING { cram, crai, bed_new, tbi_new] } - if(tools.contains('controlfreec')){ + if (tools.contains('mpileup') || tools.contains('controlfreec')){ cram_intervals_no_index = cram_recalibrated_intervals.map { meta, cram, crai, intervals -> [meta, cram, intervals] } + RUN_MPILEUP(cram_intervals_no_index, + fasta) + ch_versions = ch_versions.mix(RUN_MPILEUP.out.versions) + } + + if (tools.contains('controlfreec')){ + controlfreec_input = RUN_MPILEUP.out.mpileup + .map{ meta, pileup_tumor -> + [meta, [], pileup_tumor, [], [], [], []] + } + RUN_CONTROLFREEC_TUMORONLY( - cram_intervals_no_index, + controlfreec_input, fasta, fasta_fai, dbsnp, diff --git a/subworkflows/nf-core/variantcalling/controlfreec/somatic/main.nf b/subworkflows/nf-core/variantcalling/controlfreec/somatic/main.nf index c5e0b07678..0c88ba8737 100644 --- a/subworkflows/nf-core/variantcalling/controlfreec/somatic/main.nf +++ b/subworkflows/nf-core/variantcalling/controlfreec/somatic/main.nf @@ -1,17 +1,12 @@ -include { CAT_CAT as CAT_MPILEUP_NORMAL } from '../../../../../modules/nf-core/modules/cat/cat/main.nf' -include { CAT_CAT as CAT_MPILEUP_TUMOR } from '../../../../../modules/nf-core/modules/cat/cat/main.nf' include { CONTROLFREEC_FREEC as FREEC_SOMATIC } from '../../../../../modules/nf-core/modules/controlfreec/freec/main' include { CONTROLFREEC_ASSESSSIGNIFICANCE as ASSESS_SIGNIFICANCE } from '../../../../../modules/nf-core/modules/controlfreec/assesssignificance/main' include { CONTROLFREEC_FREEC2BED as FREEC2BED } from '../../../../../modules/nf-core/modules/controlfreec/freec2bed/main' include { CONTROLFREEC_FREEC2CIRCOS as FREEC2CIRCOS } from '../../../../../modules/nf-core/modules/controlfreec/freec2circos/main' include { CONTROLFREEC_MAKEGRAPH as MAKEGRAPH } from '../../../../../modules/nf-core/modules/controlfreec/makegraph/main' -include { SAMTOOLS_MPILEUP as MPILEUP_NORMAL } from '../../../../../modules/nf-core/modules/samtools/mpileup/main' -include { SAMTOOLS_MPILEUP as MPILEUP_TUMOR } from '../../../../../modules/nf-core/modules/samtools/mpileup/main' workflow RUN_CONTROLFREEC_SOMATIC { take: - cram_normal // channel: [mandatory] [meta, cram, crai, interval] - cram_tumor // channel: [mandatory] [meta, cram, crai, interval] + controlfreec_input // channel: [mandatory] [meta, pileup_normal, pileup_tumor, [], [], [], []] fasta // channel: [mandatory] fasta_fai // channel: [mandatory] dbsnp // channel: [mandatory] @@ -24,59 +19,6 @@ workflow RUN_CONTROLFREEC_SOMATIC { ch_versions = Channel.empty() - MPILEUP_NORMAL(cram_normal, fasta) - - MPILEUP_NORMAL.out.mpileup.branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 - }.set{mpileup_normal} - - MPILEUP_TUMOR(cram_tumor, fasta) - - MPILEUP_TUMOR.out.mpileup.branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 - }.set{mpileup_tumor} - - //Merge mpileup only when intervals and natural order sort them - CAT_MPILEUP_NORMAL( mpileup_normal.intervals.map{ meta, pileup -> - - new_meta = [patient:meta.patient, normal_id:meta.normal_id, tumor_id:meta.tumor_id, gender:meta.gender, id:meta.tumor_id + "_vs_" + meta.normal_id, num_intervals:meta.num_intervals] - - [groupKey(new_meta, meta.num_intervals), pileup] - }.groupTuple(sort:true)) - - CAT_MPILEUP_TUMOR(mpileup_tumor.intervals - .map{ meta, pileup -> - new_meta = [patient:meta.patient, normal_id:meta.normal_id, tumor_id:meta.tumor_id, gender:meta.gender, id:meta.tumor_id + "_vs_" + meta.normal_id, num_intervals:meta.num_intervals] - - [groupKey(new_meta, meta.num_intervals), pileup] - } - .groupTuple(sort:true)) - - controlfreec_input_normal = Channel.empty().mix( - CAT_MPILEUP_NORMAL.out.file_out, - mpileup_normal.no_intervals - ).map{ meta, pileup -> - new_meta = [patient:meta.patient, normal_id:meta.normal_id, tumor_id:meta.tumor_id, gender:meta.gender, id:meta.tumor_id + "_vs_" + meta.normal_id, num_intervals:meta.num_intervals] - - [new_meta, pileup] - } - - controlfreec_input_tumor = Channel.empty().mix( - CAT_MPILEUP_TUMOR.out.file_out, - mpileup_tumor.no_intervals - ).map{ meta, pileup -> - new_meta = [patient:meta.patient, normal_id:meta.normal_id, tumor_id:meta.tumor_id, gender:meta.gender, id:meta.tumor_id + "_vs_" + meta.normal_id, num_intervals:meta.num_intervals] - [new_meta, pileup] - } - - controlfreec_input_normal.cross(controlfreec_input_tumor) - .map{ normal, tumor -> - [normal[0], normal[1], tumor[1], [], [], [], []] - } - .set{controlfreec_input} - FREEC_SOMATIC(controlfreec_input, fasta, fasta_fai, @@ -93,10 +35,6 @@ workflow RUN_CONTROLFREEC_SOMATIC { FREEC2CIRCOS( FREEC_SOMATIC.out.ratio ) MAKEGRAPH(FREEC_SOMATIC.out.ratio.join(FREEC_SOMATIC.out.BAF)) - ch_versions = ch_versions.mix(MPILEUP_NORMAL.out.versions) - ch_versions = ch_versions.mix(MPILEUP_TUMOR.out.versions) - ch_versions = ch_versions.mix(CAT_MPILEUP_NORMAL.out.versions) - ch_versions = ch_versions.mix(CAT_MPILEUP_TUMOR.out.versions) ch_versions = ch_versions.mix(FREEC_SOMATIC.out.versions) ch_versions = ch_versions.mix(ASSESS_SIGNIFICANCE.out.versions) ch_versions = ch_versions.mix(FREEC2BED.out.versions) diff --git a/subworkflows/nf-core/variantcalling/controlfreec/tumoronly/main.nf b/subworkflows/nf-core/variantcalling/controlfreec/tumoronly/main.nf index 30c03ea743..c7535b10c6 100644 --- a/subworkflows/nf-core/variantcalling/controlfreec/tumoronly/main.nf +++ b/subworkflows/nf-core/variantcalling/controlfreec/tumoronly/main.nf @@ -1,14 +1,12 @@ -include { CAT_CAT as CAT_MPILEUP_TUMOR } from '../../../../../modules/nf-core/modules/cat/cat/main.nf' include { CONTROLFREEC_FREEC as FREEC_TUMORONLY } from '../../../../../modules/nf-core/modules/controlfreec/freec/main' include { CONTROLFREEC_ASSESSSIGNIFICANCE as ASSESS_SIGNIFICANCE } from '../../../../../modules/nf-core/modules/controlfreec/assesssignificance/main' include { CONTROLFREEC_FREEC2BED as FREEC2BED } from '../../../../../modules/nf-core/modules/controlfreec/freec2bed/main' include { CONTROLFREEC_FREEC2CIRCOS as FREEC2CIRCOS } from '../../../../../modules/nf-core/modules/controlfreec/freec2circos/main' include { CONTROLFREEC_MAKEGRAPH as MAKEGRAPH } from '../../../../../modules/nf-core/modules/controlfreec/makegraph/main' -include { SAMTOOLS_MPILEUP as MPILEUP_TUMOR } from '../../../../../modules/nf-core/modules/samtools/mpileup/main' workflow RUN_CONTROLFREEC_TUMORONLY { take: - cram_tumor // channel: [mandatory] [meta, cram, crai, interval] + controlfreec_input // channel: [mandatory] [meta, [], pileup_tumor, [], [], [], []] fasta // channel: [mandatory] fasta_fai // channel: [mandatory] dbsnp // channel: [mandatory] @@ -21,36 +19,6 @@ workflow RUN_CONTROLFREEC_TUMORONLY { ch_versions = Channel.empty() - MPILEUP_TUMOR(cram_tumor, fasta) - - MPILEUP_TUMOR.out.mpileup.branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 - }.set{mpileup_tumor} - - //Merge mpileup only when intervals and natural order sort them - CAT_MPILEUP_TUMOR(mpileup_tumor.intervals - .map{ meta, pileup -> - new_meta = [patient:meta.patient, sample:meta.sample, status:meta.status, gender:meta.gender, id:meta.sample, num_intervals:meta.num_intervals] - - [groupKey(new_meta, meta.num_intervals), pileup] - } - .groupTuple(sort:true)) - - controlfreec_input_tumor = Channel.empty().mix( - CAT_MPILEUP_TUMOR.out.file_out, - mpileup_tumor.no_intervals - ).map{ meta, pileup -> - new_meta = [patient:meta.patient, sample:meta.sample, status:meta.status, gender:meta.gender, id:meta.sample, num_intervals:meta.num_intervals] - - [new_meta, pileup] - } - - controlfreec_input_tumor - .map{ meta, pileup_tumor -> - [meta, [], pileup_tumor, [], [], [], []] - }.set{controlfreec_input} - FREEC_TUMORONLY(controlfreec_input, fasta, fasta_fai, @@ -67,8 +35,6 @@ workflow RUN_CONTROLFREEC_TUMORONLY { FREEC2CIRCOS( FREEC_TUMORONLY.out.ratio ) MAKEGRAPH(FREEC_TUMORONLY.out.ratio.join(FREEC_TUMORONLY.out.BAF)) - ch_versions = ch_versions.mix(MPILEUP_TUMOR.out.versions) - ch_versions = ch_versions.mix(CAT_MPILEUP_TUMOR.out.versions) ch_versions = ch_versions.mix(FREEC_TUMORONLY.out.versions) ch_versions = ch_versions.mix(ASSESS_SIGNIFICANCE.out.versions) ch_versions = ch_versions.mix(FREEC2BED.out.versions) diff --git a/subworkflows/nf-core/variantcalling/mpileup/main.nf b/subworkflows/nf-core/variantcalling/mpileup/main.nf new file mode 100644 index 0000000000..1f4ddde3d5 --- /dev/null +++ b/subworkflows/nf-core/variantcalling/mpileup/main.nf @@ -0,0 +1,35 @@ +include { CAT_CAT as CAT_MPILEUP } from '../../../../modules/nf-core/modules/cat/cat/main' +include { SAMTOOLS_MPILEUP } from '../../../../modules/nf-core/modules/samtools/mpileup/main' + +workflow RUN_MPILEUP { + take: + cram // channel: [mandatory] [meta, cram, interval] + fasta // channel: [mandatory] + + main: + + ch_versions = Channel.empty() + + SAMTOOLS_MPILEUP(cram, fasta) + mpileup = SAMTOOLS_MPILEUP.out.mpileup.branch{ + intervals: it[0].num_intervals > 1 + no_intervals: it[0].num_intervals <= 1 + } + + //Merge mpileup only when intervals and natural order sort them + CAT_MPILEUP(mpileup.intervals + .map{ meta, pileup -> + new_meta = meta.tumor_id ? [patient:meta.patient, normal_id:meta.normal_id, tumor_id:meta.tumor_id, gender:meta.gender, id:meta.tumor_id + "_vs_" + meta.normal_id, num_intervals:meta.num_intervals] // not annotated, so no variantcaller necessary + : [patient:meta.patient, sample:meta.sample, status:meta.status, gender:meta.gender, id:meta.sample, num_intervals:meta.num_intervals] + [groupKey(new_meta, meta.num_intervals), pileup] + } + .groupTuple(sort:true)) + + + ch_versions = ch_versions.mix(SAMTOOLS_MPILEUP.out.versions) + ch_versions = ch_versions.mix(CAT_MPILEUP.out.versions) + + emit: + versions = ch_versions + mpileup = Channel.empty().mix(CAT_MPILEUP.out.file_out, mpileup.no_intervals) +} diff --git a/tests/test_tools.yml b/tests/test_tools.yml index a2b3f4e58e..ab0111ebbb 100644 --- a/tests/test_tools.yml +++ b/tests/test_tools.yml @@ -95,16 +95,16 @@ - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3_ratio.png - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.bed - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.circos.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.normal.mpileup - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.normal.mpileup_control.cpn + - path: results/variant_calling/sample4_vs_sample3/mpileup/sample4_vs_sample3.normal.mpileup.gz + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.normal.mpileup.gz_control.cpn - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.p.value.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_BAF.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_CNVs - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_info.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_ratio.BedGraph - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_ratio.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_sample.cpn + - path: results/variant_calling/sample4_vs_sample3/mpileup/sample4_vs_sample3.tumor.mpileup.gz + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_BAF.txt + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_CNVs + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_info.txt + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_ratio.BedGraph + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_ratio.txt + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_sample.cpn - name: Run variant calling on somatic samples with controlfreec without intervals command: nextflow run main.nf -profile test,tools_somatic,docker --tools controlfreec -c ./tests/nextflow.config --no_intervals @@ -121,16 +121,16 @@ - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3_ratio.png - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.bed - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.circos.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.normal.mpileup - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.normal.mpileup_control.cpn + - path: results/variant_calling/sample4_vs_sample3/mpileup/sample4_vs_sample3.normal.mpileup.gz + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.normal.mpileup.gz_control.cpn - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.p.value.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_BAF.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_CNVs - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_info.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_ratio.BedGraph - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_ratio.txt - - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup_sample.cpn + - path: results/variant_calling/sample4_vs_sample3/mpileup/sample4_vs_sample3.tumor.mpileup.gz + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_BAF.txt + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_CNVs + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_info.txt + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_ratio.BedGraph + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_ratio.txt + - path: results/variant_calling/sample4_vs_sample3/controlfreec/sample4_vs_sample3.tumor.mpileup.gz_sample.cpn - name: Run variant calling on tumor_only sample with controlfreec command: nextflow run main.nf -profile test,tools_tumoronly,docker --tools controlfreec -stub-run @@ -152,7 +152,7 @@ - path: results/variant_calling/sample2/controlfreec/sample2_sample.cpn - path: results/variant_calling/sample2/controlfreec/sample2.bed - path: results/variant_calling/sample2/controlfreec/sample2.circos.txt - - path: results/variant_calling/sample2/controlfreec/sample2.tumor.mpileup + - path: results/variant_calling/sample2/mpileup/sample2.tumor.mpileup.gz - path: results/variant_calling/sample2/controlfreec/sample2.p.value.txt - name: Run variant calling on germline sample with deepvariant @@ -602,3 +602,37 @@ - path: results/variant_calling/sample4_vs_sample3/strelka/sample4_vs_sample3.somatic_snvs.vcf.gz - path: results/variant_calling/sample4_vs_sample3/strelka/sample4_vs_sample3.somatic_snvs.vcf.gz.tbi - path: results/csv/variantcalled.csv + +- name: Run variant calling on tumor_only sample to test mpileup + command: nextflow run main.nf -profile test,tools_tumoronly,docker --tools mpileup + tags: + - tumor_only + - mpileup + files: + - path: results/variant_calling/sample2/mpileup/sample2.tumor.mpileup.gz + +- name: Run variant calling on tumor_only sample to test mpileup without intervals + command: nextflow run main.nf -profile test,tools_tumoronly,docker --tools mpileup --no_intervals + tags: + - tumor_only + - mpileup + - no_intervals + files: + - path: results/variant_calling/sample2/mpileup/sample2.tumor.mpileup.gz + +- name: Run variant calling on germline sample to test mpileup + command: nextflow run main.nf -profile test,tools_germline,docker --tools mpileup + tags: + - germline + - mpileup + files: + - path: results/variant_calling/sample1/mpileup/sample1.normal.mpileup.gz + +- name: Run variant calling on germline sample to test mpileup without intervals + command: nextflow run main.nf -profile test,tools_germline,docker --tools mpileup --no_intervals + tags: + - germline + - mpileup + - no_intervals + files: + - path: results/variant_calling/sample1/mpileup/sample1.normal.mpileup.gz diff --git a/workflows/sarek.nf b/workflows/sarek.nf index e2c7f78d43..884e9452d9 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -810,7 +810,8 @@ workflow SAREK { pon, pon_tbi, chr_files, - mappability) + mappability + ) // Gather vcf files for annotation and QC vcf_to_annotate = Channel.empty()