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