GearsSingle.scala 5.47 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)
46
  var gearsUserQiimeClosed: Boolean = config("gear_use_qiime_closed", default = false)
Peter van 't Hof's avatar
Peter van 't Hof committed
47

Peter van 't Hof's avatar
Peter van 't Hof committed
48
49
  /** Executed before running the script */
  def init(): Unit = {
50
    require(fastqR1.isDefined || bamFile.isDefined, "Please specify fastq-file(s) or bam file")
Peter van 't Hof's avatar
Peter van 't Hof committed
51
    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
52
53

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

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

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

Peter van 't Hof's avatar
Peter van 't Hof committed
77
78
  /** Method to add jobs */
  def biopetScript(): Unit = {
Peter van 't Hof's avatar
Peter van 't Hof committed
79
80
    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
81
82
      case (_, _, Some(bam)) =>
        val extract = new ExtractUnmappedReads(this)
Peter van 't Hof's avatar
Peter van 't Hof committed
83
        extract.outputDir = outputDir
Peter van 't Hof's avatar
Peter van 't Hof committed
84
        extract.bamFile = bam
Peter van 't Hof's avatar
Peter van 't Hof committed
85
        extract.outputName = outputName
Peter van 't Hof's avatar
Peter van 't Hof committed
86
87
88
89
        extract.init()
        extract.biopetScript()
        addAll(extract.functions)
        (extract.fastqUnmappedR1, Some(extract.fastqUnmappedR2))
Peter van 't Hof's avatar
Peter van 't Hof committed
90
      case _ => throw new IllegalArgumentException("Missing input files")
Peter van 't Hof's avatar
Peter van 't Hof committed
91
92
    }

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

Peter van 't Hof's avatar
Peter van 't Hof committed
102
103
104
    if (gearsUseKraken) {
      val kraken = new GearsKraken(this)
      kraken.outputDir = new File(outputDir, "kraken")
Peter van 't Hof's avatar
Peter van 't Hof committed
105
106
      kraken.fastqR1 = flexiprep.fastqR1Qc
      kraken.fastqR2 = flexiprep.fastqR2Qc
Peter van 't Hof's avatar
Peter van 't Hof committed
107
108
109
110
111
112
113
114
      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
115
      val qiimeRatx = new GearsQiimeRtax(this)
Peter van 't Hof's avatar
Peter van 't Hof committed
116
      qiimeRatx.outputDir = new File(outputDir, "qiime_rtax")
Peter van 't Hof's avatar
Peter van 't Hof committed
117
118
      qiimeRatx.fastqR1 = flexiprep.fastqR1Qc
      qiimeRatx.fastqR2 = flexiprep.fastqR2Qc
Peter van 't Hof's avatar
Peter van 't Hof committed
119
120
121
      qiimeRatx.init()
      qiimeRatx.biopetScript()
      addAll(qiimeRatx.functions)
Peter van 't Hof's avatar
Peter van 't Hof committed
122
    }
123

124
125
126
127
128
129
130
131
132
133
    if (gearsUserQiimeClosed) {
      val qiimeClosed = new GearsQiimeClosed(this)
      qiimeClosed.outputDir = new File(outputDir, "qiime_rtax")
      qiimeClosed.fastqR1 = flexiprep.fastqR1Qc
      qiimeClosed.fastqR2 = flexiprep.fastqR2Qc
      qiimeClosed.init()
      qiimeClosed.biopetScript()
      addAll(qiimeClosed.functions)
    }

Wai Yi Leung's avatar
Wai Yi Leung committed
134
    addSummaryJobs()
135
  }
Peter van 't Hof's avatar
Peter van 't Hof committed
136
137

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

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

143
  /** Statistics shown in the summary file */
Wai Yi Leung's avatar
Wai Yi Leung committed
144
145
  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
146
147
    (if (fastqR1.isDefined) Map("input_R1" -> fastqR1.get) else Map()) ++
    outputFiles
148
149
150
}

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