From bbaa6236e019d683024257dc9e9773abf25a554a Mon Sep 17 00:00:00 2001
From: bow <bow@bow.web.id>
Date: Sun, 8 Mar 2015 13:33:00 +0100
Subject: [PATCH] Add per-library RNA metrics job when the sample contains more
 than 1 library

---
 .../biopet/pipelines/gentrap/Gentrap.scala    | 47 ++++++++++++-------
 1 file changed, 31 insertions(+), 16 deletions(-)

diff --git a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala
index a635d4dc4..fa80426f2 100644
--- a/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala
+++ b/public/gentrap/src/main/scala/nl/lumc/sasc/biopet/pipelines/gentrap/Gentrap.scala
@@ -279,6 +279,24 @@ class Gentrap(val root: Configurable) extends QScript with MultiSampleQScript wi
     job
   }
 
+  /** General function to create CollectRnaSeqMetrics job, for per-sample and per-library runs */
+  protected def makeCollectRnaSeqMetricsJob(alnFile: File, outMetrics: File,
+                                            outChart: Option[File] = None): CollectRnaSeqMetrics = {
+    val job = new CollectRnaSeqMetrics(qscript)
+    job.input = alnFile
+    job.output = outMetrics
+    job.refFlat = annotationRefFlat
+    job.chartOutput = outChart
+    job.assumeSorted = true
+    job.strandSpecificity = strandProtocol match {
+      case NonSpecific => Option(StrandSpecificity.NONE.toString)
+      case Dutp        => Option(StrandSpecificity.SECOND_READ_TRANSCRIPTION_STRAND.toString)
+      case _           => throw new IllegalStateException
+    }
+    job.ribosomalIntervals = ribosomalRefFlat
+    job
+  }
+
   /** Steps to run before biopetScript */
   def init(): Unit = {
     // TODO: validate that exons are flattened or not (depending on another option flag?)
@@ -338,7 +356,6 @@ class Gentrap(val root: Configurable) extends QScript with MultiSampleQScript wi
     /** Summary files of the sample */
     def summaryFiles: Map[String, File] = Map(
       "alignment" -> alnFile,
-      "metrics" -> collectRnaSeqMetricsJob.output
     ) ++ Map(
         "gene_fragments_count" -> geneFragmentsCount,
         "exon_fragments_count" -> exonFragmentsCount,
@@ -621,21 +638,8 @@ class Gentrap(val root: Configurable) extends QScript with MultiSampleQScript wi
       }
 
     /** Picard CollectRnaSeqMetrics job */
-    private def collectRnaSeqMetricsJob: CollectRnaSeqMetrics = {
-      val job = new CollectRnaSeqMetrics(qscript)
-      job.input = alnFile
-      job.output = createFile(".rna_metrics")
-      job.refFlat = annotationRefFlat
-      job.chartOutput = Option(createFile(".coverage_bias.pdf"))
-      job.assumeSorted = true
-      job.strandSpecificity = strandProtocol match {
-        case NonSpecific => Option(StrandSpecificity.NONE.toString)
-        case Dutp        => Option(StrandSpecificity.SECOND_READ_TRANSCRIPTION_STRAND.toString)
-        case _           => throw new IllegalStateException
-      }
-      job.ribosomalIntervals = ribosomalRefFlat
-      job
-    }
+    private lazy val collectRnaSeqMetricsJob: CollectRnaSeqMetrics =
+      makeCollectRnaSeqMetricsJob(alnFile, createFile(".rna_metrics"), Option(createFile(".coverage_bias.pdf")))
 
     private def wipeJob: Option[WipeReads] = removeRibosomalReads
       .option {
@@ -732,6 +736,12 @@ class Gentrap(val root: Configurable) extends QScript with MultiSampleQScript wi
       /** Alignment results of this library ~ can only be accessed after addJobs is run! */
       def alnFile: File = mappingJob.outputFiles("finalBamFile")
 
+      /** Library-level RNA-seq metrics job, only when we have more than 1 library in the sample */
+      def collectRnaSeqMetricsJob: Option[CollectRnaSeqMetrics] = (Sample.this.libraries.size > 1)
+        .option {
+          makeCollectRnaSeqMetricsJob(alnFile, createFile(".rna_metrics"), Option(createFile(".coverage_bias.pdf")))
+        }
+
       /** Per-library mapping job */
       def mappingJob: Mapping = {
         val job = new Mapping(qscript)
@@ -748,6 +758,11 @@ class Gentrap(val root: Configurable) extends QScript with MultiSampleQScript wi
       def addJobs(): Unit = {
         // create per-library alignment file
         addAll(mappingJob.functions)
+        // create RNA metrics job, if defined
+        collectRnaSeqMetricsJob match {
+          case Some(j)  => add(j); addSummarizable(j, "rna_metrics")
+          case None     => ;
+        }
         qscript.addSummaryQScript(mappingJob)
       }
 
-- 
GitLab