GearsSingle.scala 4.23 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
21
import nl.lumc.sasc.biopet.core.{ PipelineCommand, SampleLibraryTag }
import nl.lumc.sasc.biopet.extensions.kraken.{ Kraken, KrakenReport }
Wai Yi Leung's avatar
Wai Yi Leung committed
22
import nl.lumc.sasc.biopet.extensions.picard.SamToFastq
23
import nl.lumc.sasc.biopet.extensions.samtools.SamtoolsView
24
import nl.lumc.sasc.biopet.extensions.tools.KrakenReportToJson
Peter van 't Hof's avatar
Peter van 't Hof committed
25
import nl.lumc.sasc.biopet.utils.Logging
Peter van 't Hof's avatar
Peter van 't Hof committed
26
import nl.lumc.sasc.biopet.utils.config.Configurable
27
28
import org.broadinstitute.gatk.queue.QScript

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

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

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

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

Peter van 't Hof's avatar
Peter van 't Hof committed
44
45
  @Argument(required = false)
  var outputName: String = _
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
64
65
66

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

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

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

    val kraken = new GearsKraken(this)
    kraken.fastqR1 = r1
    kraken.fastqR2 = r2
    kraken.init()
    kraken.biopetScript()
    addAll(kraken.functions)
    addSummaryQScript(kraken)
99

Wai Yi Leung's avatar
Wai Yi Leung committed
100
    addSummaryJobs()
101
  }
Peter van 't Hof's avatar
Peter van 't Hof committed
102
103

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

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

109
  /** Statistics shown in the summary file */
Wai Yi Leung's avatar
Wai Yi Leung committed
110
111
  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
112
113
    (if (fastqR1.isDefined) Map("input_R1" -> fastqR1.get) else Map()) ++
    outputFiles
114
115
116
}

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