BiopetQScript.scala 4.03 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
17
18
package nl.lumc.sasc.biopet.core

import java.io.File
Peter van 't Hof's avatar
Peter van 't Hof committed
19
import java.io.PrintWriter
20
import nl.lumc.sasc.biopet.core.config.{ ConfigValueIndex, Config, Configurable }
Peter van 't Hof's avatar
Peter van 't Hof committed
21
import org.broadinstitute.gatk.utils.commandline.Argument
Peter van 't Hof's avatar
Peter van 't Hof committed
22
23
import org.broadinstitute.gatk.queue.QSettings
import org.broadinstitute.gatk.queue.function.QFunction
24
import org.broadinstitute.gatk.queue.function.scattergather.ScatterGatherableFunction
25
import org.broadinstitute.gatk.queue.util.{ Logging => GatkLogging }
26
import scala.collection.mutable.ListBuffer
27

Peter van 't Hof's avatar
Peter van 't Hof committed
28
29
30
/**
 * Base for biopet pipeline
 */
31
trait BiopetQScript extends Configurable with GatkLogging {
32

33
  @Argument(doc = "JSON config file(s)", fullName = "config_file", shortName = "config", required = false)
34
  val configfiles: List[File] = Nil
bow's avatar
bow committed
35

Peter van 't Hof's avatar
Peter van 't Hof committed
36
37
38
39
  var outputDir: File = {
    Config.getValueFromMap(globalConfig.map, ConfigValueIndex(this.configName, configPath, "output_dir")) match {
      case Some(value) => new File(value.asString)
      case _           => new File(".")
40
41
    }
  }
bow's avatar
bow committed
42

43
  @Argument(doc = "Disable all scatters", shortName = "DSC", required = false)
44
  var disableScatter: Boolean = false
45

bow's avatar
bow committed
46
47
  var outputFiles: Map[String, File] = Map()

Peter van 't Hof's avatar
Peter van 't Hof committed
48
  /** Get implemented from org.broadinstitute.gatk.queue.QScript */
Peter van 't Hof's avatar
Peter van 't Hof committed
49
  var qSettings: QSettings
bow's avatar
bow committed
50

Peter van 't Hof's avatar
Peter van 't Hof committed
51
52
53
54
  /** Get implemented from org.broadinstitute.gatk.queue.QScript */
  var functions: Seq[QFunction]

  /** Init for pipeline */
55
  def init
bow's avatar
bow committed
56

Peter van 't Hof's avatar
Peter van 't Hof committed
57
58
  /** Pipeline itself */
  def biopetScript
Peter van 't Hof's avatar
Peter van 't Hof committed
59

Peter van 't Hof's avatar
Peter van 't Hof committed
60
61
62
  /**
   * Script from queue itself, final to force some checks for each pipeline and write report
   */
63
  final def script() {
64
    outputDir = config("output_dir")
65
66
    init
    biopetScript
67

68
    if (disableScatter) for (function <- functions) function match {
69
70
71
      case f: ScatterGatherableFunction => f.scatterCount = 1
      case _                            =>
    }
72
    for (function <- functions) function match {
73
74
75
76
      case f: BiopetCommandLineFunctionTrait => {
        f.checkExecutable
        f.afterGraph
      }
Peter van 't Hof's avatar
Peter van 't Hof committed
77
      case _ =>
78
    }
Peter van 't Hof's avatar
Peter van 't Hof committed
79

Peter van 't Hof's avatar
Peter van 't Hof committed
80
    if (outputDir.canWrite) globalConfig.writeReport(qSettings.runName, outputDir + ".log/" + qSettings.runName)
81
    else BiopetQScript.addError("Output dir: '" + outputDir + "' is not writeable")
82
83

    BiopetQScript.checkErrors
84
  }
bow's avatar
bow committed
85

Peter van 't Hof's avatar
Peter van 't Hof committed
86
87
88
89
90
91
92
93
  /** Get implemented from org.broadinstitute.gatk.queue.QScript */
  def add(functions: QFunction*)

  /**
   * Function to set isIntermediate and add in 1 line
   * @param function
   * @param isIntermediate
   */
bow's avatar
bow committed
94
  def add(function: QFunction, isIntermediate: Boolean = false) {
95
96
97
    function.isIntermediate = isIntermediate
    add(function)
  }
98
}
99
100
101
102

object BiopetQScript extends Logging {
  private val errors: ListBuffer[Exception] = ListBuffer()

103
104
  def addError(error: String, debug: String = null): Unit = {
    val msg = error + (if (debug != null && logger.isDebugEnabled) "; " + debug else "")
105
106
107
108
109
    errors.append(new Exception(msg))
  }

  protected def checkErrors: Unit = {
    if (!errors.isEmpty) {
110
111
112
113
114
115
116
117
      logger.error("*************************")
      logger.error("Biopet found some errors:")
      if (logger.isDebugEnabled) {
        for (e <- errors) {
          logger.error(e.getMessage)
          logger.debug(e.getStackTrace.mkString("Stack trace:\n", "\n", "\n"))
        }
      } else {
Peter van 't Hof's avatar
Peter van 't Hof committed
118
        errors.map(_.getMessage).sorted.distinct.foreach(logger.error(_))
119
120
121
122
      }
      throw new IllegalStateException("Biopet found errors")
    }
  }
123
}