diff --git a/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala b/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala index f6a6dc090defdb238f76b68f21189faf38fd207c..981417a012d7d3e17ec87ad879e622d77273b01f 100644 --- a/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala +++ b/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetrics.scala @@ -19,7 +19,7 @@ import java.io.File import nl.lumc.sasc.biopet.utils.config.Configurable import nl.lumc.sasc.biopet.core.summary.SummaryQScript -import nl.lumc.sasc.biopet.core.{ PipelineCommand, SampleLibraryTag } +import nl.lumc.sasc.biopet.core.{ BiopetFifoPipe, PipelineCommand, SampleLibraryTag } import nl.lumc.sasc.biopet.extensions.bedtools.{ BedtoolsCoverage, BedtoolsIntersect } import nl.lumc.sasc.biopet.extensions.picard._ import nl.lumc.sasc.biopet.extensions.samtools.SamtoolsFlagstat @@ -151,33 +151,24 @@ class BamMetrics(val root: Configurable) extends QScript with SummaryQScript wit val targetDir = new File(outputDir, targetName) val biStrict = BedtoolsIntersect(this, inputBam, intervals.bed, - output = new File(targetDir, inputBam.getName.stripSuffix(".bam") + ".overlap.strict.bam"), + output = new File(targetDir, inputBam.getName.stripSuffix(".bam") + ".overlap.strict.sam"), minOverlap = config("strict_intersect_overlap", default = 1.0)) - biStrict.isIntermediate = true - add(biStrict) - add(SamtoolsFlagstat(this, biStrict.output, targetDir)) val biopetFlagstatStrict = BiopetFlagstat(this, biStrict.output, targetDir) - add(biopetFlagstatStrict) addSummarizable(biopetFlagstatStrict, targetName + "_biopet_flagstat_strict") + add(new BiopetFifoPipe(this, List(biStrict, biopetFlagstatStrict))) val biLoose = BedtoolsIntersect(this, inputBam, intervals.bed, - output = new File(targetDir, inputBam.getName.stripSuffix(".bam") + ".overlap.loose.bam"), + output = new File(targetDir, inputBam.getName.stripSuffix(".bam") + ".overlap.loose.sam"), minOverlap = config("loose_intersect_overlap", default = 0.01)) - biLoose.isIntermediate = true - add(biLoose) - add(SamtoolsFlagstat(this, biLoose.output, targetDir)) val biopetFlagstatLoose = BiopetFlagstat(this, biLoose.output, targetDir) - add(biopetFlagstatLoose) addSummarizable(biopetFlagstatLoose, targetName + "_biopet_flagstat_loose") + add(new BiopetFifoPipe(this, List(biLoose, biopetFlagstatLoose))) - val coverageFile = new File(targetDir, inputBam.getName.stripSuffix(".bam") + ".coverage") - - //FIXME:should use piping - add(BedtoolsCoverage(this, inputBam, intervals.bed, coverageFile, depth = true), isIntermediate = true) - val covStats = CoverageStats(this, coverageFile, targetDir) - covStats.title = Some("Coverage for " + targetName) - covStats.subTitle = Some(".") - add(covStats) + val bedCov = BedtoolsCoverage(this, intervals.bed, inputBam, depth = true) + val covStats = CoverageStats(this, targetDir, inputBam.getName.stripSuffix(".bam") + ".coverage") + covStats.title = Some("Coverage Plot") + covStats.subTitle = Some(s"for file '$targetName.bed'") + add(bedCov | covStats) addSummarizable(covStats, targetName + "_cov_stats") } diff --git a/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala b/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala index 212724776c3dad98a1c514d17d6c66623c169127..a12aced89381468c3e51bdb6dc533af08446eb45 100644 --- a/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala +++ b/public/bammetrics/src/main/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/scripts/CoverageStats.scala @@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Input, Output } class CoverageStats(val root: Configurable) extends PythonCommandLineFunction with Summarizable { setPythonScript("bedtools_cov_stats.py") - @Input(doc = "Input file") + @Input(doc = "Input file", required = false) var input: File = _ @Output(doc = "output File") @@ -41,7 +41,7 @@ class CoverageStats(val root: Configurable) extends PythonCommandLineFunction wi override def defaultCoreMemory = 9.0 def cmdLine = getPythonCommand + - required(input) + + (if (inputAsStdin) " - " else required(input)) + required("--plot", plot) + optional("--title", title) + optional("--subtitle", subTitle) + @@ -55,11 +55,10 @@ class CoverageStats(val root: Configurable) extends PythonCommandLineFunction wi } object CoverageStats { - def apply(root: Configurable, input: File, outputDir: File): CoverageStats = { + def apply(root: Configurable, outputDir: File, name: String): CoverageStats = { val coverageStats = new CoverageStats(root) - coverageStats.input = input - coverageStats.output = new File(outputDir, input.getName + ".stats") - coverageStats.plot = new File(outputDir, input.getName + ".stats.png") + coverageStats.output = new File(outputDir, name + ".stats") + coverageStats.plot = new File(outputDir, name + ".stats.png") coverageStats } } diff --git a/public/bammetrics/src/test/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetricsTest.scala b/public/bammetrics/src/test/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetricsTest.scala index 33304cb198807f46d3801ddfc9b05eaa7d555fe4..dcd32fe1d71924353daea489b623745b729b72fd 100644 --- a/public/bammetrics/src/test/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetricsTest.scala +++ b/public/bammetrics/src/test/scala/nl/lumc/sasc/biopet/pipelines/bammetrics/BamMetricsTest.scala @@ -81,12 +81,7 @@ class BamMetricsTest extends TestNGSuite with Matchers { bammetrics.functions.count(_.isInstanceOf[CollectMultipleMetrics]) shouldBe 1 bammetrics.functions.count(_.isInstanceOf[CalculateHsMetrics]) shouldBe (if (amplicon) 1 else 0) bammetrics.functions.count(_.isInstanceOf[CollectTargetedPcrMetrics]) shouldBe (if (amplicon) 1 else 0) - bammetrics.functions.count(_.isInstanceOf[BiopetFlagstat]) shouldBe (1 + (regions * 2)) - bammetrics.functions.count(_.isInstanceOf[SamtoolsFlagstat]) shouldBe (1 + (regions * 2)) - bammetrics.functions.count(_.isInstanceOf[BedtoolsIntersect]) shouldBe (regions * 2) - - bammetrics.functions.count(_.isInstanceOf[BedtoolsCoverage]) shouldBe regions - bammetrics.functions.count(_.isInstanceOf[CoverageStats]) shouldBe regions + bammetrics.functions.count(_.isInstanceOf[BiopetFlagstat]) shouldBe 1 } // remove temporary run directory all tests in the class have been run diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala index 98024e79e25aa0c98624e2ff0e01783d37e35537..85cd80712d496259ad043c6fe851640b800d193f 100644 --- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala +++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsCoverage.scala @@ -41,32 +41,26 @@ class BedtoolsCoverage(val root: Configurable) extends Bedtools { @Argument(doc = "diffStrand", required = false) var diffStrand: Boolean = false - var inputTag = "-a" - - override def beforeCmd() { - if (input.getName.endsWith(".bam")) inputTag = "-abam" - } - override def defaultCoreMemory = 4.0 /** Returns command to execute */ def cmdLine = required(executable) + required("coverage") + - required(inputTag, input) + + required("-a", input) + required("-b", intersectFile) + conditional(depth, "-d") + conditional(sameStrand, "-s") + conditional(diffStrand, "-S") + - " > " + required(output) + (if (outputAsStsout) "" else " > " + required(output)) } object BedtoolsCoverage { /** Returns defaul bedtools coverage */ - def apply(root: Configurable, input: File, intersect: File, output: File, - depth: Boolean = true, sameStrand: Boolean = false, diffStrand: Boolean = false): BedtoolsCoverage = { + def apply(root: Configurable, input: File, intersect: File, output: Option[File] = None, + depth: Boolean = false, sameStrand: Boolean = false, diffStrand: Boolean = false): BedtoolsCoverage = { val bedtoolsCoverage = new BedtoolsCoverage(root) bedtoolsCoverage.input = input bedtoolsCoverage.intersectFile = intersect - bedtoolsCoverage.output = output + output.foreach(bedtoolsCoverage.output = _) bedtoolsCoverage.depth = depth bedtoolsCoverage.sameStrand = sameStrand bedtoolsCoverage.diffStrand = diffStrand diff --git a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala index 75f179ad326939d65f01031a4e909c59565e4906..bbd110c88d4d45a516fb8df3c92ff35c7b961284 100644 --- a/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala +++ b/public/biopet-extensions/src/main/scala/nl/lumc/sasc/biopet/extensions/bedtools/BedtoolsIntersect.scala @@ -40,6 +40,8 @@ class BedtoolsIntersect(val root: Configurable) extends Bedtools { var inputTag = "-a" + var ubam = false + override def beforeCmd() { if (input.getName.endsWith(".bam")) inputTag = "-abam" } @@ -50,6 +52,7 @@ class BedtoolsIntersect(val root: Configurable) extends Bedtools { required("-b", intersectFile) + optional("-f", minOverlap) + conditional(count, "-c") + + conditional(ubam, "-ubam") + " > " + required(output) } @@ -61,6 +64,7 @@ object BedtoolsIntersect { bedtoolsIntersect.input = input bedtoolsIntersect.intersectFile = intersect bedtoolsIntersect.output = output + if (output.getName.endsWith(".sam")) bedtoolsIntersect.ubam = true bedtoolsIntersect.minOverlap = minOverlap bedtoolsIntersect.count = count bedtoolsIntersect diff --git a/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala b/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala index c8b81c0c4d31d6424db74390390c758096478838..cbe6fd6eb56e9d7eab647cad238456717d10a6b8 100644 --- a/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala +++ b/public/sage/src/main/scala/nl/lumc/sasc/biopet/pipelines/sage/Sage.scala @@ -173,19 +173,22 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript { } def addBedtoolsCounts(bamFile: File, outputPrefix: String, outputDir: File) { - val bedtoolsSense = BedtoolsCoverage(this, bamFile, squishedCountBed, new File(outputDir, outputPrefix + ".genome.sense.coverage"), + val bedtoolsSense = BedtoolsCoverage(this, bamFile, squishedCountBed, + output = Some(new File(outputDir, outputPrefix + ".genome.sense.coverage")), depth = false, sameStrand = true, diffStrand = false) val countSense = new BedtoolsCoverageToCounts(this) countSense.input = bedtoolsSense.output countSense.output = new File(outputDir, outputPrefix + ".genome.sense.counts") - val bedtoolsAntisense = BedtoolsCoverage(this, bamFile, squishedCountBed, new File(outputDir, outputPrefix + ".genome.antisense.coverage"), + val bedtoolsAntisense = BedtoolsCoverage(this, bamFile, squishedCountBed, + output = Some(new File(outputDir, outputPrefix + ".genome.antisense.coverage")), depth = false, sameStrand = false, diffStrand = true) val countAntisense = new BedtoolsCoverageToCounts(this) countAntisense.input = bedtoolsAntisense.output countAntisense.output = new File(outputDir, outputPrefix + ".genome.antisense.counts") - val bedtools = BedtoolsCoverage(this, bamFile, squishedCountBed, new File(outputDir, outputPrefix + ".genome.coverage"), + val bedtools = BedtoolsCoverage(this, bamFile, squishedCountBed, + output = Some(new File(outputDir, outputPrefix + ".genome.coverage")), depth = false, sameStrand = false, diffStrand = false) val count = new BedtoolsCoverageToCounts(this) count.input = bedtools.output diff --git a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaTrait.scala b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaTrait.scala index 5e80f114c82bd16fb1efd7788158f31d1c2c0f05..b628744d325184b46b176c1b9b9871208b72a170 100644 --- a/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaTrait.scala +++ b/public/shiva/src/main/scala/nl/lumc/sasc/biopet/pipelines/shiva/ShivaTrait.scala @@ -246,7 +246,7 @@ trait ShivaTrait extends MultiSampleQScript with SummaryQScript with Reference { }).toList) lazy val variantcalling = if (config("single_sample_variantcalling", default = false).asBoolean) { - Some(makeVariantcalling(multisample = true)) + Some(makeVariantcalling(multisample = false)) } else None /** This will add sample jobs */