GearsSingle.scala 5.02 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 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.
 */
package nl.lumc.sasc.biopet.pipelines.gears

Peter van 't Hof's avatar
Peter van 't Hof committed
18
import nl.lumc.sasc.biopet.core.summary.SummaryQScript
Peter van 't Hof's avatar
Peter van 't Hof committed
19
import nl.lumc.sasc.biopet.core.BiopetQScript.InputFile
Peter van 't Hof's avatar
Peter van 't Hof committed
20
import nl.lumc.sasc.biopet.core.{ PipelineCommand, SampleLibraryTag }
Peter van 't Hof's avatar
Peter van 't Hof committed
21
import nl.lumc.sasc.biopet.extensions.seqtk.SeqtkSeq
Peter van 't Hof's avatar
Peter van 't Hof committed
22
import nl.lumc.sasc.biopet.pipelines.flexiprep.Flexiprep
Peter van 't Hof's avatar
Peter van 't Hof committed
23
import nl.lumc.sasc.biopet.utils.config.Configurable
24
25
import org.broadinstitute.gatk.queue.QScript

26
/**
Wai Yi Leung's avatar
Wai Yi Leung committed
27
 * Created by wyleung
28
 */
29
class GearsSingle(val root: Configurable) extends QScript with SummaryQScript with SampleLibraryTag {
30
  def this() = this(null)
31

Wai Yi Leung's avatar
Wai Yi Leung committed
32
33
  @Input(doc = "R1 reads in FastQ format", shortName = "R1", required = false)
  var fastqR1: Option[File] = None
34

Wai Yi Leung's avatar
Wai Yi Leung committed
35
36
  @Input(doc = "R2 reads in FastQ format", shortName = "R2", required = false)
  var fastqR2: Option[File] = None
37

Wai Yi Leung's avatar
Wai Yi Leung committed
38
  @Input(doc = "All unmapped reads will be extracted from this bam for analysis", shortName = "bam", required = false)
Peter van 't Hof's avatar
Peter van 't Hof committed
39
  var bamFile: Option[File] = None
40

Peter van 't Hof's avatar
Peter van 't Hof committed
41
42
  @Argument(required = false)
  var outputName: String = _
43

Peter van 't Hof's avatar
Peter van 't Hof committed
44
  var gearsUseKraken: Boolean = config("gears_use_kraken", default = true)
Peter van 't Hof's avatar
Peter van 't Hof committed
45
  var gearsUserQiimeRtax: Boolean = config("gear_use_qiime_rtax", default = false)
Peter van 't Hof's avatar
Peter van 't Hof committed
46

Peter van 't Hof's avatar
Peter van 't Hof committed
47
48
  /** Executed before running the script */
  def init(): Unit = {
49
    require(fastqR1.isDefined || bamFile.isDefined, "Please specify fastq-file(s) or bam file")
Peter van 't Hof's avatar
Peter van 't Hof committed
50
    require(fastqR1.isDefined != bamFile.isDefined, "Provide either a bam file or a R1/R2 file")
Peter van 't Hof's avatar
Peter van 't Hof committed
51
52

    if (outputName == null) {
Wai Yi Leung's avatar
Wai Yi Leung committed
53
      if (fastqR1.isDefined) outputName = fastqR1.map(_.getName
Peter van 't Hof's avatar
Peter van 't Hof committed
54
55
56
57
58
        .stripSuffix(".gz")
        .stripSuffix(".fastq")
        .stripSuffix(".fq"))
        .getOrElse("noName")
      else outputName = bamFile.map(_.getName.stripSuffix(".bam")).getOrElse("noName")
59
    }
Peter van 't Hof's avatar
Peter van 't Hof committed
60
61
62
63

    if (fastqR1.isDefined) {
      fastqR1.foreach(inputFiles :+= InputFile(_))
      fastqR2.foreach(inputFiles :+= InputFile(_))
Peter van 't Hof's avatar
Peter van 't Hof committed
64
    } else inputFiles :+= InputFile(bamFile.get)
Peter van 't Hof's avatar
Peter van 't Hof committed
65
  }
66

Wai Yi Leung's avatar
Wai Yi Leung committed
67
  override def reportClass = {
68
    val gears = new GearsSingleReport(this)
Wai Yi Leung's avatar
Wai Yi Leung committed
69
70
    gears.outputDir = new File(outputDir, "report")
    gears.summaryFile = summaryFile
71
72
    sampleId.foreach(gears.args += "sampleId" -> _)
    libId.foreach(gears.args += "libId" -> _)
Wai Yi Leung's avatar
Wai Yi Leung committed
73
74
    Some(gears)
  }
75

Peter van 't Hof's avatar
Peter van 't Hof committed
76
77
  /** Method to add jobs */
  def biopetScript(): Unit = {
Peter van 't Hof's avatar
Peter van 't Hof committed
78
79
    val (r1, r2): (File, Option[File]) = (fastqR1, fastqR2, bamFile) match {
      case (Some(r1), _, _) => (r1, fastqR2)
Peter van 't Hof's avatar
Peter van 't Hof committed
80
81
      case (_, _, Some(bam)) =>
        val extract = new ExtractUnmappedReads(this)
Peter van 't Hof's avatar
Peter van 't Hof committed
82
        extract.outputDir = outputDir
Peter van 't Hof's avatar
Peter van 't Hof committed
83
        extract.bamFile = bam
Peter van 't Hof's avatar
Peter van 't Hof committed
84
        extract.outputName = outputName
Peter van 't Hof's avatar
Peter van 't Hof committed
85
86
87
88
        extract.init()
        extract.biopetScript()
        addAll(extract.functions)
        (extract.fastqUnmappedR1, Some(extract.fastqUnmappedR2))
Peter van 't Hof's avatar
Peter van 't Hof committed
89
      case _ => throw new IllegalArgumentException("Missing input files")
Peter van 't Hof's avatar
Peter van 't Hof committed
90
91
    }

Peter van 't Hof's avatar
Peter van 't Hof committed
92
93
94
    val flexiprep = new Flexiprep(this)
    flexiprep.input_R1 = r1
    flexiprep.input_R2 = r2
Peter van 't Hof's avatar
Peter van 't Hof committed
95
    flexiprep.outputDir = new File(outputDir, "flexiprep")
Peter van 't Hof's avatar
Peter van 't Hof committed
96
97
98
99
    flexiprep.init()
    flexiprep.biopetScript()
    addAll(flexiprep.functions)

Peter van 't Hof's avatar
Peter van 't Hof committed
100
101
102
    if (gearsUseKraken) {
      val kraken = new GearsKraken(this)
      kraken.outputDir = new File(outputDir, "kraken")
Peter van 't Hof's avatar
Peter van 't Hof committed
103
104
      kraken.fastqR1 = flexiprep.fastqR1Qc
      kraken.fastqR2 = flexiprep.fastqR2Qc
Peter van 't Hof's avatar
Peter van 't Hof committed
105
106
107
108
109
110
111
112
      kraken.outputName = outputName
      kraken.init()
      kraken.biopetScript()
      addAll(kraken.functions)
      addSummaryQScript(kraken)
    }

    if (gearsUserQiimeRtax) {
Peter van 't Hof's avatar
Peter van 't Hof committed
113
      val qiimeRatx = new GearsQiimeRtax(this)
Peter van 't Hof's avatar
Peter van 't Hof committed
114
      qiimeRatx.outputDir = new File(outputDir, "qiime_rtax")
Peter van 't Hof's avatar
Peter van 't Hof committed
115
116
      qiimeRatx.fastqR1 = flexiprep.fastqR1Qc
      qiimeRatx.fastqR2 = flexiprep.fastqR2Qc
Peter van 't Hof's avatar
Peter van 't Hof committed
117
118
119
      qiimeRatx.init()
      qiimeRatx.biopetScript()
      addAll(qiimeRatx.functions)
Peter van 't Hof's avatar
Peter van 't Hof committed
120
    }
121

Wai Yi Leung's avatar
Wai Yi Leung committed
122
    addSummaryJobs()
123
  }
Peter van 't Hof's avatar
Peter van 't Hof committed
124
125

  /** Location of summary file */
Peter van 't Hof's avatar
Peter van 't Hof committed
126
  def summaryFile = new File(outputDir, sampleId.getOrElse("sampleName_unknown") + ".gears.summary.json")
Peter van 't Hof's avatar
Peter van 't Hof committed
127

128
  /** Pipeline settings shown in the summary file */
129
  def summarySettings: Map[String, Any] = Map.empty
Peter van 't Hof's avatar
Peter van 't Hof committed
130

131
  /** Statistics shown in the summary file */
Wai Yi Leung's avatar
Wai Yi Leung committed
132
133
  def summaryFiles: Map[String, File] = Map.empty ++
    (if (bamFile.isDefined) Map("input_bam" -> bamFile.get) else Map()) ++
Wai Yi Leung's avatar
Wai Yi Leung committed
134
135
    (if (fastqR1.isDefined) Map("input_R1" -> fastqR1.get) else Map()) ++
    outputFiles
136
137
138
}

/** This object give a default main method to the pipelines */
139
object GearsSingle extends PipelineCommand