GearsSingle.scala 6.07 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
/**
 * 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
 *
11
 * A dual licensing mode is applied. The source code within this project is freely available for non-commercial use under an AGPL
12
13
14
15
16
 * 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
17
import nl.lumc.sasc.biopet.core.summary.SummaryQScript
Peter van 't Hof's avatar
Peter van 't Hof committed
18
import nl.lumc.sasc.biopet.core.BiopetQScript.InputFile
Peter van 't Hof's avatar
Peter van 't Hof committed
19
import nl.lumc.sasc.biopet.core.{ PipelineCommand, SampleLibraryTag }
Peter van 't Hof's avatar
Peter van 't Hof committed
20
import nl.lumc.sasc.biopet.pipelines.flexiprep.Flexiprep
Peter van 't Hof's avatar
Peter van 't Hof committed
21
import nl.lumc.sasc.biopet.utils.config.Configurable
22
23
import org.broadinstitute.gatk.queue.QScript

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

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

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

Wai Yi Leung's avatar
Wai Yi Leung committed
36
  @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
37
  var bamFile: Option[File] = None
38

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

Peter van 't Hof's avatar
Peter van 't Hof committed
42
  lazy val krakenScript = if (config("gears_use_kraken", default = true)) Some(new GearsKraken(this)) else None
Peter van 't Hof's avatar
Peter van 't Hof committed
43
44
45
  lazy val qiimeRatx = if (config("gears_use_qiime_rtax", default = false)) Some(new GearsQiimeRtax(this)) else None
  lazy val qiimeClosed = if (config("gears_use_qiime_closed", default = false)) Some(new GearsQiimeClosed(this)) else None
  lazy val seqCount = if (config("gears_use_seq_count", default = false)) Some(new GearsSeqCount(this)) else None
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
  protected var skipFlexiprep: Boolean = config("skip_flexiprep", default = false)

78
  protected def executeFlexiprep(r1: File, r2: Option[File]): (File, Option[File]) = {
Peter van 't Hof's avatar
Peter van 't Hof committed
79
    if (!skipFlexiprep) {
80
      val flexiprep = new Flexiprep(this)
Sander van der Zeeuw's avatar
Sander van der Zeeuw committed
81
      flexiprep.inputR1 = r1
82
      flexiprep.inputR2 = r2
83
84
85
86
87
88
      flexiprep.outputDir = new File(outputDir, "flexiprep")
      add(flexiprep)
      (flexiprep.fastqR1Qc, flexiprep.fastqR2Qc)
    } else (r1, r2)
  }

Peter van 't Hof's avatar
Peter van 't Hof committed
89
90
  /** Method to add jobs */
  def biopetScript(): Unit = {
Peter van 't Hof's avatar
Peter van 't Hof committed
91
    val (r1, r2): (File, Option[File]) = (fastqR1, fastqR2, bamFile) match {
92
      case (Some(r1), _, _) => executeFlexiprep(r1, fastqR2)
Peter van 't Hof's avatar
Peter van 't Hof committed
93
94
      case (_, _, Some(bam)) =>
        val extract = new ExtractUnmappedReads(this)
Peter van 't Hof's avatar
Peter van 't Hof committed
95
        extract.outputDir = outputDir
Peter van 't Hof's avatar
Peter van 't Hof committed
96
        extract.bamFile = bam
Peter van 't Hof's avatar
Peter van 't Hof committed
97
        extract.outputName = outputName
Peter van 't Hof's avatar
Peter van 't Hof committed
98
        add(extract)
Peter van 't Hof's avatar
Peter van 't Hof committed
99
        executeFlexiprep(extract.fastqUnmappedR1, extract.fastqUnmappedR2)
Peter van 't Hof's avatar
Peter van 't Hof committed
100
      case _ => throw new IllegalArgumentException("Missing input files")
Peter van 't Hof's avatar
Peter van 't Hof committed
101
102
    }

Peter van 't Hof's avatar
Peter van 't Hof committed
103
104
105
    lazy val combinedFastq = {
      r2 match {
        case Some(r2) =>
106
107
108
109
110
111
          val combineReads = new CombineReads(this)
          combineReads.outputDir = new File(outputDir, "combine_reads")
          combineReads.fastqR1 = r1
          combineReads.fastqR2 = r2
          add(combineReads)
          combineReads.combinedFastq
Peter van 't Hof's avatar
Peter van 't Hof committed
112
113
114
115
        case _ => r1
      }
    }

Peter van 't Hof's avatar
Peter van 't Hof committed
116
    krakenScript foreach { kraken =>
Peter van 't Hof's avatar
Peter van 't Hof committed
117
      kraken.outputDir = new File(outputDir, "kraken")
118
119
      kraken.fastqR1 = r1
      kraken.fastqR2 = r2
Peter van 't Hof's avatar
Peter van 't Hof committed
120
      kraken.outputName = outputName
Peter van 't Hof's avatar
Peter van 't Hof committed
121
      add(kraken)
Peter van 't Hof's avatar
Peter van 't Hof committed
122
123
    }

Peter van 't Hof's avatar
Peter van 't Hof committed
124
    qiimeRatx foreach { qiimeRatx =>
Peter van 't Hof's avatar
Peter van 't Hof committed
125
      qiimeRatx.outputDir = new File(outputDir, "qiime_rtax")
126
127
      qiimeRatx.fastqR1 = r1
      qiimeRatx.fastqR2 = r2
Peter van 't Hof's avatar
Peter van 't Hof committed
128
      add(qiimeRatx)
Peter van 't Hof's avatar
Peter van 't Hof committed
129
    }
130

Peter van 't Hof's avatar
Peter van 't Hof committed
131
    qiimeClosed foreach { qiimeClosed =>
Peter van 't Hof's avatar
Peter van 't Hof committed
132
      qiimeClosed.outputDir = new File(outputDir, "qiime_closed")
Peter van 't Hof's avatar
Peter van 't Hof committed
133
      qiimeClosed.fastqInput = combinedFastq
Peter van 't Hof's avatar
Peter van 't Hof committed
134
      add(qiimeClosed)
135
136
    }

Peter van 't Hof's avatar
Peter van 't Hof committed
137
138
139
140
141
142
    seqCount.foreach { seqCount =>
      seqCount.fastqInput = combinedFastq
      seqCount.outputDir = new File(outputDir, "seq_count")
      add(seqCount)
    }

Wai Yi Leung's avatar
Wai Yi Leung committed
143
    addSummaryJobs()
144
  }
Peter van 't Hof's avatar
Peter van 't Hof committed
145
146

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

149
  /** Pipeline settings shown in the summary file */
Peter van 't Hof's avatar
Peter van 't Hof committed
150
151
152
153
154
155
  def summarySettings: Map[String, Any] = Map(
    "skip_flexiprep" -> skipFlexiprep,
    "gears_use_kraken" -> krakenScript.isDefined,
    "gear_use_qiime_rtax" -> qiimeRatx.isDefined,
    "gear_use_qiime_closed" -> qiimeClosed.isDefined
  )
Peter van 't Hof's avatar
Peter van 't Hof committed
156

157
  /** Statistics shown in the summary file */
Wai Yi Leung's avatar
Wai Yi Leung committed
158
159
  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
160
    (if (fastqR1.isDefined) Map("input_R1" -> fastqR1.get) else Map()) ++
Peter van 't Hof's avatar
Peter van 't Hof committed
161
    (if (fastqR2.isDefined) Map("input_R2" -> fastqR2.get) else Map()) ++
Wai Yi Leung's avatar
Wai Yi Leung committed
162
    outputFiles
163
164
165
}

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