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 bd37846..c106e76 100644 --- a/modules/processes/postprocess/main.nf +++ b/modules/processes/postprocess/main.nf @@ -353,6 +353,58 @@ process mafstats { """ } +process maf2mfa { + tag "mafstats" + publishDir "${params.outdir}/maf", mode: 'copy', overwrite: true + label 'medium' + + input: + path final_maf + val sourceFa + val targetFa + + output: + path "${final_maf.baseName}.mfa" + + stub: + """ + 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: + """ + 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",