From 76da88831f060eaf7171e63875d11b660adb76ca Mon Sep 17 00:00:00 2001
From: sajvanderzeeuw <s.a.j.van_der_zeeuw@lumc.nl>
Date: Thu, 15 Oct 2015 17:20:25 +0200
Subject: [PATCH] added proper piping to bcftools and mpileup. [GENTRAP VARSCAN
 SHOULD BE TESTED]

---
 .../extensions/bcftools/BcftoolsCall.scala    | 56 ++++++++++++++++---
 .../extensions/samtools/SamtoolsMpileup.scala | 11 ++--
 .../extensions/tools/MpileupToVcf.scala       | 29 +++-------
 .../gentrap/extensions/CustomVarScan.scala    |  4 +-
 .../shiva/ShivaVariantcallingTrait.scala      | 42 +++++---------
 5 files changed, 77 insertions(+), 65 deletions(-)

diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/BcftoolsCall.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/BcftoolsCall.scala
index 537cd377d..8b721d36a 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/BcftoolsCall.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bcftools/BcftoolsCall.scala
@@ -22,28 +22,66 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output }
 
 /** This extension is based on bcftools 1.1-134 */
 class BcftoolsCall(val root: Configurable) extends Bcftools {
-  @Input(doc = "Input File")
+  @Input(doc = "Input File", required = false)
   var input: File = _
 
-  @Output(doc = "output File")
+  @Output(doc = "output File", required = false)
   var output: File = _
 
-  var O: String = null
-  var v: Boolean = config("v", default = true)
+  var O: Option[String] = None
+  var v: Boolean = config("v", default = false)
   var c: Boolean = config("c", default = false)
   var m: Boolean = config("m", default = false)
+  var r: Option[String] = config("r")
+  @Input(required = false)
+  var R: Option[String] = config("R")
+  var s: Option[String] = config("s")
+  @Input(required = false)
+  var S: Option[File] = config("S")
+  var t: Option[String] = config("t")
+  @Input(required = false)
+  var T: Option[String] = config("T")
+  var A: Boolean = config("A", default = false)
+  var f: List[String] = config("f", default = Nil)
+  var g: Option[Int] = config("g")
+  var i: Boolean = config("i", default = false)
+  var M: Boolean = config("M", default = false)
+  var V: Option[String] = config("V")
+  var C: Option[String] = config("C")
+  var n: Option[Float] = config("n")
+  var p: Option[Float] = config("p")
+  var P: Option[Float] = config("P")
+  var X: Boolean = config("X", default = false)
+  var Y: Boolean = config("Y", default = false)
 
   override def beforeGraph(): Unit = {
     require(c != m)
   }
 
-  def cmdBase = required(executable) +
+  def cmdLine = required(executable) +
     required("call") +
     optional("-O", O) +
     conditional(v, "-v") +
     conditional(c, "-c") +
-    conditional(m, "-m")
-  def cmdPipeInput = cmdBase + "-"
-  def cmdPipe = cmdBase + input
-  def cmdLine = cmdPipe + " > " + required(output)
+    conditional(m, "-m") +
+    optional("-r", r) +
+    optional("-R", R) +
+    optional("-s", s) +
+    optional("-S", S) +
+    optional("-t", t) +
+    optional("-T", T) +
+    conditional(A, "-A") +
+    repeat("-f", f) +
+    optional("-g", g) +
+    conditional(i, "-i") +
+    conditional(M, "-M") +
+    optional("-V", V) +
+    optional("-C", C) +
+    optional("-n", n) +
+    optional("-p", p) +
+    optional("-P", P) +
+    conditional(X, "-X") +
+    conditional(Y, "-Y") +
+    (if (outputAsStsout) "" else required("-o", output)) +
+    (if (inputAsStdin) "-" else required(input))
 }
diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsMpileup.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsMpileup.scala
index 449b49cf0..02ded651d 100644
--- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsMpileup.scala
+++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/samtools/SamtoolsMpileup.scala
@@ -47,7 +47,7 @@ class SamtoolsMpileup(val root: Configurable) extends Samtools with Reference {
     reference = referenceFasta()
   }
 
-  def cmdBase = required(executable) +
+  def cmdLine = required(executable) +
     required("mpileup") +
     optional("-f", reference) +
     optional("-l", intervalBed) +
@@ -56,12 +56,9 @@ class SamtoolsMpileup(val root: Configurable) extends Samtools with Reference {
     optional("-d", depth) +
     conditional(outputMappingQuality, "-s") +
     conditional(disableBaq, "-B") +
-    conditional(u, "-u")
-  def cmdPipeInput = cmdBase + "-"
-  def cmdPipe = cmdBase + repeat(input)
-
-  /** Returns command to execute */
-  def cmdLine = cmdPipe + " > " + required(output)
+    conditional(u, "-u") +
+    (if (outputAsStsout) "" else required("-o", output)) +
+    (if (inputAsStdin) "-" else repeat(input))
 }
 
 object SamtoolsMpileup {
diff --git a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala
index 60797ce9c..27e7ce903 100644
--- a/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala
+++ b/public/biopet-tools-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/tools/MpileupToVcf.scala
@@ -47,12 +47,9 @@ class MpileupToVcf(val root: Configurable) extends ToolCommandFuntion with Refer
 
   override def defaultCoreMemory = 3.0
 
-  override def defaults = ConfigUtils.mergeMaps(Map("samtoolsmpileup" -> Map("disable_baq" -> true, "min_map_quality" -> 1)),
-    super.defaults)
-
   override def beforeGraph() {
     super.beforeGraph()
-    reference = referenceFasta().getAbsolutePath
+    if (reference == null) reference = referenceFasta().getAbsolutePath
     val samtoolsMpileup = new SamtoolsMpileup(this)
   }
 
@@ -66,20 +63,12 @@ class MpileupToVcf(val root: Configurable) extends ToolCommandFuntion with Refer
     }
   }
 
-  override def cmdLine = {
-    (if (inputMpileup == null) {
-      val samtoolsMpileup = new SamtoolsMpileup(this)
-      samtoolsMpileup.reference = referenceFasta()
-      samtoolsMpileup.input = List(inputBam)
-      samtoolsMpileup.cmdPipe + " | "
-    } else "") +
-      super.cmdLine +
-      required("-o", output) +
-      optional("--minDP", minDP) +
-      optional("--minAP", minAP) +
-      optional("--homoFraction", homoFraction) +
-      optional("--ploidy", ploidy) +
-      required("--sample", sample) +
-      (if (inputBam == null) required("-I", inputMpileup) else "")
-  }
+  override def cmdLine = super.cmdLine +
+    required("-o", output) +
+    optional("--minDP", minDP) +
+    optional("--minAP", minAP) +
+    optional("--homoFraction", homoFraction) +
+    optional("--ploidy", ploidy) +
+    required("--sample", sample) +
+    (if (inputAsStdin) "" else required("-I", inputMpileup))
 }
diff --git a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala
index 8871f481f..f2f11a03e 100644
--- a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala
+++ b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/extensions/CustomVarScan.scala
@@ -48,6 +48,7 @@ class CustomVarScan(val root: Configurable) extends BiopetCommandLineFunction wi
     disableBaq = true
     depth = Option(1000000)
     outputMappingQuality = true
+
   }
 
   private def fixMpileup = new PythonCommandLineFunction {
@@ -96,7 +97,6 @@ class CustomVarScan(val root: Configurable) extends BiopetCommandLineFunction wi
   def cmdLine: String = {
     // FIXME: manual trigger of commandLine for version retrieval
     mpileup.commandLine
-    mpileup.cmdPipe + " | " + fixMpileup.commandLine + " | " + removeEmptyPile().commandLine + " | " +
-      varscan.commandLine + " && " + compress.commandLine + " && " + index.commandLine
+    (mpileup | fixMpileup | removeEmptyPile() | varscan).commandLine + " && " + compress.commandLine + " && " + index.commandLine
   }
 }
diff --git a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
index cdf358e97..985d75879 100644
--- a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
+++ b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaVariantcallingTrait.scala
@@ -48,6 +48,8 @@ trait ShivaVariantcallingTrait extends SummaryQScript with SampleLibraryTag with
     }
   }
 
+  override def defaults = Map("bcftoolscall" -> Map("f" -> List("GQ")))
+
   /** Executed before script */
   def init(): Unit = {
   }
@@ -165,20 +167,11 @@ trait ShivaVariantcallingTrait extends SummaryQScript with SampleLibraryTag with
       mp.reference = referenceFasta()
 
       val bt = new BcftoolsCall(qscript)
-      bt.O = "z"
+      bt.O = Some("z")
       bt.v = true
       bt.c = true
 
-      //TODO: add proper class with piping support, see also issue #114
-      add(new CommandLineFunction {
-        @Input
-        var input = inputBams
-
-        @Output
-        var output = outputFile
-
-        def commandLine: String = mp.cmdPipe + " | " + bt.cmdPipeInput + " > " + outputFile + " && tabix -p vcf " + outputFile
-      })
+      add(mp | bt > outputFile)
     }
   }
 
@@ -195,27 +188,16 @@ trait ShivaVariantcallingTrait extends SummaryQScript with SampleLibraryTag with
         val mp = new SamtoolsMpileup(qscript)
         mp.input :+= inputBam
         mp.u = true
-        //TODO: proper piping should be implemented
         mp.reference = referenceFasta()
 
         val bt = new BcftoolsCall(qscript)
-        bt.O = "z"
+        bt.O = Some("z")
         bt.v = true
         bt.c = true
+        bt.output = new File(outputDir, inputBam.getName + ".vcf.gz")
 
-        val sampleVcf = new File(outputDir, inputBam.getName + ".vcf.gz")
-
-        //TODO: add proper class with piping support, see also issue #114
-        add(new CommandLineFunction {
-          @Input
-          var input = inputBam
-
-          @Output
-          var output = sampleVcf
-
-          def commandLine: String = mp.cmdPipe + " | " + bt.cmdPipeInput + " > " + output + " && tabix -p vcf " + output
-        })
-        sampleVcf
+        add(mp | bt)
+        bt.output
       }
 
       val cv = new CombineVariants(qscript)
@@ -238,10 +220,16 @@ trait ShivaVariantcallingTrait extends SummaryQScript with SampleLibraryTag with
 
     def addJobs() {
       val rawFiles = inputBams.map(bamFile => {
+        val mp = new SamtoolsMpileup(qscript) {
+          override def configName = "samtoolsmpileup"
+          override def defaults = Map("samtoolsmpileup" -> Map("disable_baq" -> true, "min_map_quality" -> 1))
+        }
+        mp.input :+= bamFile
+
         val m2v = new MpileupToVcf(qscript)
         m2v.inputBam = bamFile
         m2v.output = new File(outputDir, bamFile.getName.stripSuffix(".bam") + ".raw.vcf")
-        add(m2v)
+        add(mp | m2v)
 
         val vcfFilter = new VcfFilter(qscript) {
           override def configName = "vcffilter"
-- 
GitLab