From 9cae33902ab50f91d82bf0ffa7a7b0aad0af7d49 Mon Sep 17 00:00:00 2001
From: Peter van 't Hof <p.j.van_t_hof@lumc.nl>
Date: Wed, 27 Jan 2016 19:44:47 +0100
Subject: [PATCH] Fixed createMetaExonCounts method

---
 .../lumc/sasc/biopet/tools/BaseCounter.scala  | 29 ++++++++++++-------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/BaseCounter.scala b/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/BaseCounter.scala
index 9cfb85103..5f251506c 100644
--- a/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/BaseCounter.scala
+++ b/public/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/BaseCounter.scala
@@ -248,18 +248,25 @@ object BaseCounter extends ToolCommand {
     counts.values.toList
   }
 
-  //FIXME: This is not yet working
-  def createMetaExonCounts(genes: List[Gene]): List[String, RegionCount] = {
-    val regions = (for (gene <- genes; region <- generateMergedExonRegions(gene).allRecords)
-      yield gene.getName -> region).sortBy(_._2.start)
-
-    def mergeRegions(todo: List[(String, BedRecord)],
-                     inOverlap: List[(String, BedRecord)] = Nil,
-                     output: List[(String, RegionCount)] = Nil): List[(String, RegionCount)] = {
-      if (todo.head._2.overlapWith(todo.tail.head._2)) Nil
-      else Nil
+  def createMetaExonCounts(genes: List[Gene]): List[(String, RegionCount)] = {
+    val regions = genes.map(gene => gene.getName -> generateMergedExonRegions(gene).sorted)
+    val chr = genes.head.getContig
+    val begin = regions.map(_._2.allRecords.head.start).min
+    val end = regions.map(_._2.allRecords.last.end).max
+
+    val posibleEnds = (regions.flatMap(_._2.allRecords.map(_.end)) ++ regions.flatMap(_._2.allRecords.map(_.start))).distinct.sorted
+
+    def mergeRegions(newBegin: Int, output: List[(String, RegionCount)] = Nil): List[(String, RegionCount)] = {
+      if (newBegin > end) output
+      else {
+        val newEnd = posibleEnds.filter(_ > begin).min
+        val record = BedRecord(chr, newBegin, newEnd)
+        val names = regions.filter(_._2.overlapWith(record).size > 0).map(_._1)
+        if (names.nonEmpty) mergeRegions(newEnd, (names.mkString(","), new RegionCount(record.start + 1, record.end)) :: output)
+        else mergeRegions(newEnd, output)
+      }
     }
-    Nil
+    mergeRegions(begin)
   }
 
   def bamRecordBasesOverlap(samRecord: SAMRecord, start: Int, end: Int): Int = {
-- 
GitLab