From 091f86da75fb56f3e2bb42f9fc019eb8c0386615 Mon Sep 17 00:00:00 2001
From: Peter van 't Hof <p.j.van_t_hof@lumc.nl>
Date: Fri, 9 Jan 2015 15:40:44 +0100
Subject: [PATCH] Extended sample handing in multisample qscript

---
 .../biopet/pipelines/gatk/GatkPipeline.scala  |  4 +-
 .../sasc/biopet/core/MultiSampleQScript.scala | 51 ++++++++++++++++++-
 .../lumc/sasc/biopet/core/ToolCommand.scala   |  8 +--
 .../biopet/core/config/Configurable.scala     |  6 +--
 .../lumc/sasc/biopet/utils/ConfigUtils.scala  |  1 +
 5 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
index 75834b45f..0031e2c15 100644
--- a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
+++ b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala
@@ -62,7 +62,7 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri
   }
 
   val multisampleVariantcalling = new GatkVariantcalling(this) {
-    override protected lazy val configName = "gatkvariantcalling"
+    override def configName = "gatkvariantcalling"
     override def configPath: List[String] = "multisample" :: super.configPath
   }
 
@@ -97,7 +97,7 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri
         val allRawVcfFiles = for ((sampleID, sampleOutput) <- samplesOutput) yield sampleOutput.variantcalling.rawFilterVcfFile
 
         val gatkVariantcalling = new GatkVariantcalling(this) {
-          override protected lazy val configName = "gatkvariantcalling"
+          override def configName = "gatkvariantcalling"
           override def configPath: List[String] = "multisample" :: super.configPath
         }
 
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
index bfce62da0..3eb4fc516 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala
@@ -15,7 +15,7 @@
  */
 package nl.lumc.sasc.biopet.core
 
-import nl.lumc.sasc.biopet.core.config.{ Config, Configurable }
+import nl.lumc.sasc.biopet.core.config.{ ConfigValue, Config, Configurable }
 import nl.lumc.sasc.biopet.utils.ConfigUtils._
 
 trait MultiSampleQScript extends BiopetQScript {
@@ -39,7 +39,9 @@ trait MultiSampleQScript extends BiopetQScript {
       var sample = any2map(value)
       if (!sample.contains("ID")) sample += ("ID" -> key)
       if (sample("ID") == key) {
+        setCurrentSample(key)
         samplesOutput += key -> runSingleSampleJobs(sample)
+        unsetCurrentSample()
       } else logger.warn("Key is not the same as ID on value for sample")
     }
     else logger.warn("No Samples found in config")
@@ -63,11 +65,58 @@ trait MultiSampleQScript extends BiopetQScript {
         var library = any2map(value)
         if (!library.contains("ID")) library += ("ID" -> key)
         if (library("ID") == key) {
+          setCurrentLibrary(key)
           output += key -> runSingleLibraryJobs(library, sampleConfig)
+          unsetCurrentLibrary()
         } else logger.warn("Key is not the same as ID on value for run of sample: " + sampleID)
       }
     } else logger.warn("No runs found in config for sample: " + sampleID)
     return output
   }
   def runSingleLibraryJobs(runConfig: Map[String, Any], sampleConfig: Map[String, Any]): LibraryOutput
+
+  private var currentSample: String = null
+  private var currentLibrary: String = null
+
+  def setCurrentSample(sample: String) {
+    currentSample = sample
+  }
+
+  def unsetCurrentSample() {
+    currentSample = null
+  }
+
+  def setCurrentLibrary(library: String) {
+    currentLibrary = library
+  }
+
+  def unsetCurrentLibrary() {
+    currentLibrary = null
+  }
+
+  override protected[core] def configFullPath: List[String] = {
+    (if (currentSample != null) "samples" :: currentSample :: Nil else Nil) :::
+      (if (currentLibrary != null) "libraries" :: currentLibrary :: Nil else Nil) :::
+      super.configFullPath
+  }
+
+  protected class ConfigFunctions extends super.ConfigFunctions {
+    override def apply(key: String,
+                       default: Any = null,
+                       submodule: String = null,
+                       required: Boolean = false,
+                       freeVar: Boolean = true,
+                       sample: String = currentSample,
+                       library: String = currentLibrary): ConfigValue = {
+      super.apply(key, default, submodule, required, freeVar, sample, library)
+    }
+
+    override def contains(key: String,
+                          submodule: String = null,
+                          freeVar: Boolean = true,
+                          sample: String = currentSample,
+                          library: String = currentLibrary) = {
+      super.contains(key, submodule, freeVar, sample, library)
+    }
+  }
 }
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala
index c454c0a91..b3b25e9a7 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala
@@ -16,10 +16,10 @@
 package nl.lumc.sasc.biopet.core
 
 trait ToolCommand extends MainCommand with Logging {
-  abstract class AbstractArgs {
+  protected abstract class AbstractArgs {
   }
 
-  abstract class AbstractOptParser extends scopt.OptionParser[Args](commandName) {
+  protected abstract class AbstractOptParser extends scopt.OptionParser[Args](commandName) {
     opt[String]('l', "log_level") foreach { x =>
       x.toLowerCase match {
         case "debug" => logger.setLevel(org.apache.log4j.Level.DEBUG)
@@ -44,6 +44,6 @@ trait ToolCommand extends MainCommand with Logging {
     } text ("Print version")
   }
 
-  type Args <: AbstractArgs
-  type OptParser <: AbstractOptParser
+  protected type Args <: AbstractArgs
+  protected type OptParser <: AbstractOptParser
 }
\ No newline at end of file
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala
index 9ce006570..54c67437d 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/config/Configurable.scala
@@ -21,9 +21,9 @@ import nl.lumc.sasc.biopet.utils.ConfigUtils.ImplicitConversions
 
 trait Configurable extends ImplicitConversions {
   val root: Configurable
-  lazy val configPath: List[String] = if (root != null) root.configFullPath else List()
-  protected[config] lazy val configName = getClass.getSimpleName.toLowerCase
-  protected[config] lazy val configFullPath: List[String] = configPath ::: configName :: Nil
+  def configPath: List[String] = if (root != null) root.configFullPath else List()
+  protected[core] def configName = getClass.getSimpleName.toLowerCase
+  protected[core] def configFullPath: List[String] = configPath ::: configName :: Nil
   var defaults: scala.collection.mutable.Map[String, Any] = if (root != null) scala.collection.mutable.Map(root.defaults.toArray: _*)
   else scala.collection.mutable.Map()
 
diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala
index 9855e7248..a0a428d60 100644
--- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala
+++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/utils/ConfigUtils.scala
@@ -200,6 +200,7 @@ object ConfigUtils extends Logging {
     any match {
       case i: Int    => i
       case i: Double => i.toInt
+      case i: Long   => i.toInt
       case i: String => {
         logger.warn("Value '" + any + "' is a string insteadof int in json file, trying auto convert")
         i.toInt
-- 
GitLab