Picard.scala 3.43 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * Biopet is built on top of GATK Queue for building bioinformatic
 * pipelines. It is mainly intended to support LUMC SHARK cluster which is running
 * SGE. But other types of HPC that are supported by GATK Queue (such as PBS)
 * should also be able to execute Biopet tools and pipelines.
 *
 * Copyright 2014 Sequencing Analysis Support Core - Leiden University Medical Center
 *
 * Contact us at: sasc@lumc.nl
 *
 * A dual licensing mode is applied. The source code within this project that are
 * not part of GATK Queue is freely available for non-commercial use under an AGPL
 * license; For commercial users or users who do not want to follow the AGPL
 * license, please contact us to obtain a separate license.
 */
16
package nl.lumc.sasc.biopet.extensions.picard
17

18
19
import java.io.File

20
import nl.lumc.sasc.biopet.core.BiopetJavaCommandLineFunction
bow's avatar
bow committed
21
import org.broadinstitute.gatk.utils.commandline.{ Argument }
22

23
24
import scala.io.Source

Peter van 't Hof's avatar
Peter van 't Hof committed
25
26
27
/**
 * General picard extension
 *
Peter van 't Hof's avatar
Peter van 't Hof committed
28
 * This is based on using class files directly from the jar, if needed other picard jar can be used
Peter van 't Hof's avatar
Peter van 't Hof committed
29
 */
30
31
32
abstract class Picard extends BiopetJavaCommandLineFunction {
  override def subPath = "picard" :: super.subPath

33
34
  if (config.contains("picard_jar")) jarFile = config("picard_jar")

bow's avatar
bow committed
35
  @Argument(doc = "VERBOSITY", required = false)
Peter van 't Hof's avatar
Peter van 't Hof committed
36
  var verbosity: Option[String] = config("verbosity")
bow's avatar
bow committed
37
38

  @Argument(doc = "QUIET", required = false)
39
  var quiet: Boolean = config("quiet", default = false)
bow's avatar
bow committed
40
41

  @Argument(doc = "VALIDATION_STRINGENCY", required = false)
Peter van 't Hof's avatar
Peter van 't Hof committed
42
  var stringency: Option[String] = config("validationstringency")
bow's avatar
bow committed
43
44

  @Argument(doc = "COMPRESSION_LEVEL", required = false)
45
  var compression: Option[Int] = config("compressionlevel")
bow's avatar
bow committed
46
47

  @Argument(doc = "MAX_RECORDS_IN_RAM", required = false)
48
  var maxRecordsInRam: Option[Int] = config("maxrecordsinram")
bow's avatar
bow committed
49
50

  @Argument(doc = "CREATE_INDEX", required = false)
51
  var createIndex: Boolean = config("createindex", default = true)
bow's avatar
bow committed
52
53

  @Argument(doc = "CREATE_MD5_FILE", required = false)
54
  var createMd5: Boolean = config("createmd5", default = false)
bow's avatar
bow committed
55

56
57
58
59
60
61
  override def versionCommand = {
    if (jarFile != null) executable + " -cp " + jarFile + " " + javaMainClass + " -h"
    else null
  }
  override val versionRegex = """Version: (.*)""".r
  override val versionExitcode = List(0, 1)
bow's avatar
bow committed
62

Peter van 't Hof's avatar
Peter van 't Hof committed
63
  override val defaultCoreMemory = 3.0
bow's avatar
bow committed
64

65
66
  override def commandLine = super.commandLine +
    required("TMP_DIR=" + jobTempDir) +
bow's avatar
bow committed
67
    optional("VERBOSITY=", verbosity, spaceSeparated = false) +
68
    conditional(quiet, "QUIET=TRUE") +
bow's avatar
bow committed
69
70
71
    optional("VALIDATION_STRINGENCY=", stringency, spaceSeparated = false) +
    optional("COMPRESSION_LEVEL=", compression, spaceSeparated = false) +
    optional("MAX_RECORDS_IN_RAM=", maxRecordsInRam, spaceSeparated = false) +
72
73
74
    conditional(createIndex, "CREATE_INDEX=TRUE") +
    conditional(createMd5, "CREATE_MD5_FILE=TRUE")
}
75
76
77

object Picard {

Peter van 't Hof's avatar
Peter van 't Hof committed
78
79
80
81
82
  /**
   * This function parse a metrics file in separated values
   * @param file input metrics file
   * @return (header, content)
   */
83
  def getMetrics(file: File): Option[(Array[String], List[Array[String]])] =
84
85
    if (file.exists) {
      val lines = Source.fromFile(file).getLines().toArray
86

87
88
89
90
91
92
93
94
95
96
      val start = lines.indexWhere(_.startsWith("## METRICS CLASS")) + 1
      val end = lines.indexOf("", start)

      val header = lines(start).split("\t")
      val content = (for (i <- (start + 1) until end) yield lines(i).split("\t")).toList

      Option((header, content))
    } else {
      None
    }
97
98

}