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 eb21f9f4b02741281c10ec10647ef2d61007c84d..770845f78d793fc84e204dcdd94e4634257bfb73 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 6a97e23032ecb300f44fb949f1fc5b8c929e6dbc..fa68fa455f5df7d2b61471f4d3a2777914afedf9 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 91db3220fc944cb726d1a5aefec95f73c086d922..14bb9752571dd5375b9661ceafb36893f3285b26 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 = {