From 378dc2a320a173f390b54232ac5e8ef675aa5597 Mon Sep 17 00:00:00 2001
From: Peter van 't Hof <p.j.van_t_hof@lumc.nl>
Date: Wed, 6 Jul 2016 18:24:37 +0200
Subject: [PATCH] Added better type casting

---
 .../sasc/biopet/tools/bamstats/BamStats.scala  | 12 +++++++++---
 .../sasc/biopet/tools/bamstats/Histogram.scala | 18 +++++++++++-------
 .../sasc/biopet/tools/bamstats/Stats.scala     | 14 +++++++-------
 3 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/BamStats.scala b/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/BamStats.scala
index eb21f9f4b..770845f78 100644
--- a/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/BamStats.scala
+++ b/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/BamStats.scala
@@ -1,16 +1,18 @@
 package nl.lumc.sasc.biopet.tools.bamstats
 
 import java.io.File
+import java.util.concurrent.TimeoutException
 
 import htsjdk.samtools.reference.FastaSequenceFile
-import htsjdk.samtools.{ SAMSequenceDictionary, SamReaderFactory }
+import htsjdk.samtools.{SAMSequenceDictionary, SamReaderFactory}
 import nl.lumc.sasc.biopet.utils.BamUtils.SamDictCheck
 import nl.lumc.sasc.biopet.utils.ToolCommand
 import nl.lumc.sasc.biopet.utils.intervals.{ BedRecord, BedRecordList }
 
 import scala.collection.JavaConversions._
 import scala.concurrent.ExecutionContext.Implicits.global
-import scala.concurrent.Future
+import scala.concurrent.duration._
+import scala.concurrent.{ Await, Future }
 
 /**
  * This tool will collect stats from a bamfile
@@ -135,7 +137,11 @@ object BamStats extends ToolCommand {
       done.foreach(stats += _.value.get.get)
       running = running.filterNot(done.contains(_))
       if (running.nonEmpty && done.nonEmpty) msg.foreach(m => logger.info(s"Jobs for '$m', ${running.size}/${futures.size} jobs"))
-      if (running.nonEmpty) Thread.sleep(1000)
+      if (running.nonEmpty) try {
+        Await.ready(running.head, 1 second)
+      } catch {
+        case e: TimeoutException =>
+      }
     }
     msg.foreach(m => logger.info(s"All jobs for '$m' are done"))
     stats
diff --git a/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Histogram.scala b/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Histogram.scala
index 6a97e2303..fa68fa455 100644
--- a/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Histogram.scala
+++ b/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Histogram.scala
@@ -7,25 +7,29 @@ import scala.collection.mutable
 /**
  * Created by pjvanthof on 05/07/16.
  */
-case class Histogram() {
-  protected[Histogram] val histrogram: mutable.Map[Int, Long] = mutable.Map()
+class Counts[T](implicit ord: Ordering[T]) {
+  protected[Counts] val counts: mutable.Map[T, Long] = mutable.Map()
 
   /** This will add an other histogram to `this` */
-  def +=(other: Histogram): Histogram = {
-    other.histrogram.foreach(x => this.histrogram += x._1 -> (this.histrogram.getOrElse(x._1, 0L) + x._2))
+  def +=(other: Counts[T]): Counts[T] = {
+    other.counts.foreach(x => this.counts += x._1 -> (this.counts.getOrElse(x._1, 0L) + x._2))
     this
   }
 
   /** With this a value can be added to the histogram */
-  def add(value: Int): Unit = {
-    histrogram += value -> (histrogram.getOrElse(value, 0L) + 1)
+  def add(value: T): Unit = {
+    counts += value -> (counts.getOrElse(value, 0L) + 1)
   }
 
   /** Write histogram to a tsv/count file */
   def writeToTsv(file: File): Unit = {
     val writer = new PrintWriter(file)
     writer.println("value\tcount")
-    histrogram.keys.toList.sorted.foreach(x => writer.println(s"$x\t${histrogram(x)}"))
+    counts.keys.toList.sorted.foreach(x => writer.println(s"$x\t${counts(x)}"))
     writer.close()
   }
 }
+
+class Histogram[T](implicit ord: Numeric[T]) extends Counts[T] {
+
+}
diff --git a/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Stats.scala b/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Stats.scala
index 91db3220f..14bb97525 100644
--- a/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Stats.scala
+++ b/biopet-tools/src/main/scala/nl/lumc/sasc/biopet/tools/bamstats/Stats.scala
@@ -8,13 +8,13 @@ case class Stats() {
   var totalReads = 0L
   var unmapped = 0L
   var secondary = 0L
-  val mappingQualityHistogram = Histogram()
-  val insertSizeHistogram = Histogram()
-  val clippingHistogram = Histogram()
-  val leftClippingHistogram = Histogram()
-  val rightClippingHistogram = Histogram()
-  val _5_ClippingHistogram = Histogram()
-  val _3_ClippingHistogram = Histogram()
+  val mappingQualityHistogram = new Histogram[Int]
+  val insertSizeHistogram = new Histogram[Int]
+  val clippingHistogram = new Histogram[Int]
+  val leftClippingHistogram = new Histogram[Int]
+  val rightClippingHistogram = new Histogram[Int]
+  val _5_ClippingHistogram = new Histogram[Int]
+  val _3_ClippingHistogram = new Histogram[Int]
 
   /** This will add an other [[Stats]] inside `this` */
   def +=(other: Stats): Stats = {
-- 
GitLab