From 68ec126ebb28b713a1546ea1f3f56c257d037aef Mon Sep 17 00:00:00 2001 From: RenzoTale88 <23279528+RenzoTale88@users.noreply.github.com> Date: Tue, 30 Jan 2024 10:52:50 +0000 Subject: [PATCH 1/2] Draft --- modules/processes/postprocess/main.nf | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/modules/processes/postprocess/main.nf b/modules/processes/postprocess/main.nf index bd37846..4f823b7 100644 --- a/modules/processes/postprocess/main.nf +++ b/modules/processes/postprocess/main.nf @@ -353,6 +353,34 @@ process mafstats { """ } +process makevcf { + tag "mafstats" + publishDir "${params.outdir}/vcf", mode: 'copy', overwrite: true + label 'medium' + + input: + path final_maf + val sourceFa + val targetFa + + output: + path "mafCoverage.*" + path "mafIdentity.*" + path "mafStats.*" + + stub: + """ + touch mafCoverage.out + touch mafIdentity.out + touch mafStats.out + """ + + script: + """ + mafToFastaStitcher --maf $final_maf --seqs ${sourceFa},${targetFa} --breakpointPenalty 5 --interstitialSequence 20 --outMfa ${final_maf.baseName}.mfa + """ +} + // Liftover functions process liftover{ tag "liftover" From b15f54bd238b7954463671d73021d4e48317c4ad Mon Sep 17 00:00:00 2001 From: Andrea Talenti <23279528+RenzoTale88@users.noreply.github.com> Date: Sat, 7 Sep 2024 10:51:22 +0100 Subject: [PATCH 2/2] Add functioning VCF output --- main.nf | 4 +++ modules/processes/postprocess/main.nf | 42 +++++++++++++++++++++------ modules/subworkflows/GSAlign.nf | 7 +++-- modules/subworkflows/blat.nf | 5 ++-- modules/subworkflows/lastz.nf | 7 +++-- modules/subworkflows/minimap2.nf | 7 +++-- nextflow.config | 1 + nextflow_schema.json | 8 +++-- 8 files changed, 59 insertions(+), 22 deletions(-) diff --git a/main.nf b/main.nf index baab5f2..3063acb 100644 --- a/main.nf +++ b/main.nf @@ -22,6 +22,7 @@ include {LIFTOVER} from './modules/subworkflows/liftover' include {DATA} from './modules/subworkflows/data' include {make_report} from './modules/processes/postprocess' include {decompress as DECOMPRESS_ANNOTATION} from "./modules/processes/preprocess" +include {maf2mfa; mfa2vcf} from "./modules/processes/postprocess" params(params) // Run the workflow workflow { @@ -187,4 +188,7 @@ no_maf : $params.no_maf""" rmd = Channel.fromPath("${baseDir}/assets/gatherMetrics.Rmd") make_report(aligned_ch.mafs, aligned_ch.mafc, aligned_ch.mafi, liftstats, rmd) } + if (params.vcf){ + maf2mfa(ALIGNER.out.maf, ch_source, ch_target) | mfa2vcf + } } diff --git a/modules/processes/postprocess/main.nf b/modules/processes/postprocess/main.nf index 4f823b7..c106e76 100644 --- a/modules/processes/postprocess/main.nf +++ b/modules/processes/postprocess/main.nf @@ -353,9 +353,9 @@ process mafstats { """ } -process makevcf { +process maf2mfa { tag "mafstats" - publishDir "${params.outdir}/vcf", mode: 'copy', overwrite: true + publishDir "${params.outdir}/maf", mode: 'copy', overwrite: true label 'medium' input: @@ -364,23 +364,47 @@ process makevcf { val targetFa output: - path "mafCoverage.*" - path "mafIdentity.*" - path "mafStats.*" + path "${final_maf.baseName}.mfa" stub: """ - touch mafCoverage.out - touch mafIdentity.out - touch mafStats.out + touch ${final_maf.baseName}.mfa + """ + + script: + """ + mafToFastaStitcher --maf ${final_maf} --seqs ${sourceFa},${targetFa} --breakpointPenalty 5 --interstitialSequence 20 --outMfa ${final_maf.baseName}.mfa + """ +} + +process mfa2vcf { + tag "mafstats" + publishDir "${params.outdir}/vcf", mode: 'copy', overwrite: true + label 'medium' + conda "bioconda::ucsc-fatovcf bioconda::tabix" + + input: + path mfa + + output: + path "${mfa.baseName}.vcf.gz" + path "${mfa.baseName}.vcf.gz.tbi" + + stub: + """ + touch ${mfa.baseName}.vcf.gz + touch ${mfa.baseName}.vcf.gz.tbi """ script: """ - mafToFastaStitcher --maf $final_maf --seqs ${sourceFa},${targetFa} --breakpointPenalty 5 --interstitialSequence 20 --outMfa ${final_maf.baseName}.mfa + faToVcf ${mfa} ${mfa.baseName}.vcf + bgzip ${mfa.baseName}.vcf + tabix -p vcf ${mfa.baseName}.vcf.gz """ } + // Liftover functions process liftover{ tag "liftover" diff --git a/modules/subworkflows/GSAlign.nf b/modules/subworkflows/GSAlign.nf index f9a1f6e..d4f09fb 100644 --- a/modules/subworkflows/GSAlign.nf +++ b/modules/subworkflows/GSAlign.nf @@ -46,10 +46,10 @@ workflow GSALIGN { net_ch = netSynt.out } chainsubset(net_ch, chainMerge.out) - if(!params.no_maf){ + if(!params.no_maf || params.vcf){ chain2maf( chainsubset.out[0], twoBitS, twoBitT, twoBitSN, twoBitTN ) - name_maf_seq( chain2maf.out ) - mafstats( name_maf_seq.out, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) + maf = name_maf_seq( chain2maf.out ) + mafstats( maf, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) mafs = mafstats.out[0] mafc = mafstats.out[1] mafi = mafstats.out[2] @@ -65,4 +65,5 @@ workflow GSALIGN { mafs = mafs mafc = mafc mafi = mafi + maf = maf } diff --git a/modules/subworkflows/blat.nf b/modules/subworkflows/blat.nf index 5556fc1..51b89f5 100644 --- a/modules/subworkflows/blat.nf +++ b/modules/subworkflows/blat.nf @@ -50,8 +50,8 @@ workflow BLAT { chainsubset(net_ch, chainMerge.out) if(!params.no_maf){ chain2maf( chainsubset.out.liftover_ch, twoBitS, twoBitT, twoBitSN, twoBitTN ) - name_maf_seq( chain2maf.out ) - mafstats( name_maf_seq.out, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) + maf = name_maf_seq( chain2maf.out ) + mafstats( maf, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) mafs = mafstats.out[0] mafc = mafstats.out[1] mafi = mafstats.out[2] @@ -67,4 +67,5 @@ workflow BLAT { mafs = mafs mafc = mafc mafi = mafi + maf = maf } diff --git a/modules/subworkflows/lastz.nf b/modules/subworkflows/lastz.nf index 68b2a6f..c7e37e4 100644 --- a/modules/subworkflows/lastz.nf +++ b/modules/subworkflows/lastz.nf @@ -68,10 +68,10 @@ workflow LASTZ { net_ch = netSynt.out } chainsubset(net_ch, chainMerge.out) - if(!params.no_maf){ + if(!params.no_maf || params.vcf){ chain2maf( chainsubset.out[0], twoBitS, twoBitT, twoBitSN, twoBitTN ) - name_maf_seq( chain2maf.out ) - mafstats( name_maf_seq.out, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) + maf = name_maf_seq( chain2maf.out ) + mafstats( maf, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) mafs = mafstats.out[0] mafc = mafstats.out[1] mafi = mafstats.out[2] @@ -87,4 +87,5 @@ workflow LASTZ { mafs = mafs mafc = mafc mafi = mafi + maf = maf } diff --git a/modules/subworkflows/minimap2.nf b/modules/subworkflows/minimap2.nf index d0e8aef..9959fa0 100644 --- a/modules/subworkflows/minimap2.nf +++ b/modules/subworkflows/minimap2.nf @@ -42,10 +42,10 @@ workflow MINIMAP2 { net_ch = netSynt.out } chainsubset(net_ch, chainMerge.out) - if(!params.no_maf){ + if(!params.no_maf || params.vcf){ chain2maf( chainsubset.out[0], twoBitS, twoBitT, twoBitSN, twoBitTN ) - name_maf_seq( chain2maf.out ) - mafstats( name_maf_seq.out, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) + maf = name_maf_seq( chain2maf.out ) + mafstats( maf, ch_source.map { it.simpleName }, ch_target.map { it.simpleName } ) mafs = mafstats.out[0] mafc = mafstats.out[1] mafi = mafstats.out[2] @@ -61,4 +61,5 @@ workflow MINIMAP2 { mafs = mafs mafc = mafc mafi = mafi + maf = maf } diff --git a/nextflow.config b/nextflow.config index 679f3bc..f451121 100644 --- a/nextflow.config +++ b/nextflow.config @@ -34,6 +34,7 @@ params { igenomes_base = 's3://ngi-igenomes/igenomes/' igenomes_ignore = false no_maf = false + vcf = false no_netsynt = false mafTools = null report = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 824e9ad..f1e72d0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -55,8 +55,8 @@ }, "annotation_format": { "type": "string", - "default": "null", - "enum": ["null", "gff", "bed", "gtf", "vcf", "bam", "maf"] + "default": null, + "enum": [null, "gff", "bed", "gtf", "vcf", "bam", "maf"] } } }, @@ -198,6 +198,10 @@ "type": "boolean", "default": false }, + "vcf": { + "type": "boolean", + "default": false + }, "mafTools": { "type": "string", "format": "directory-path",