diff --git a/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala b/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala index 0f2eed5d1b30e96cb36d9cc6f3936e93a87364f2..c260f4561de8eb1ab46d3d7b8f8fcdb20a4d14b5 100644 --- a/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala +++ b/protected/basty/src/main/scala/nl/lumc/sasc/biopet/pipelines/basty/Basty.scala @@ -41,7 +41,7 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript { var outputSnps: FastaOutput = _ protected def addJobs(): Unit = { - addLibsJobs() + addPerLibJobs() output = addGenerateFasta(sampleId, sampleDir) outputSnps = addGenerateFasta(sampleId, sampleDir, snpsOnly = true) } @@ -56,11 +56,13 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript { gatkPipeline.biopetScript addAll(gatkPipeline.functions) + addSamplesJobs() + } + + def addMultiSampleJobs(): Unit = { val refVariants = addGenerateFasta(null, outputDir + "reference/", outputName = "reference") val refVariantSnps = addGenerateFasta(null, outputDir + "reference/", outputName = "reference", snpsOnly = true) - addSamplesJobs() - val catVariants = Cat(this, refVariants.variants :: samples.map(_._2.output.variants).toList, outputDir + "fastas/variant.fasta") add(catVariants) val catVariantsSnps = Cat(this, refVariantSnps.variants :: samples.map(_._2.outputSnps.variants).toList, outputDir + "fastas/variant.snps_only.fasta") @@ -129,6 +131,7 @@ class Basty(val root: Configurable) extends QScript with MultiSampleQScript { addTreeJobs(catVariantsSnps.output, catConsensusVariantsSnps.output, outputDir + "trees" + File.separator + "snps_only", "snps_only") addTreeJobs(catVariants.output, catConsensusVariants.output, outputDir + "trees" + File.separator + "snps_indels", "snps_indels") + } def addGenerateFasta(sampleName: String, outputDir: String, outputName: String = null, diff --git a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala index 8ea6f9706b0e675b3f4fa1271c72038b1b2c3d6f..88600e576f4a1f622d64df4db09d4896f8e607bb 100644 --- a/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala +++ b/protected/biopet-gatk-pipelines/src/main/scala/nl/lumc/sasc/biopet/pipelines/gatk/GatkPipeline.scala @@ -127,7 +127,7 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri gatkVariantcalling.outputDir = sampleDir + "/variantcalling/" protected def addJobs(): Unit = { - addLibsJobs() + addPerLibJobs() gatkVariantcalling.inputBams = libraries.map(_._2.mapping.finalBamFile).toList gatkVariantcalling.preProcesBams = false if (!singleSampleCalling) { @@ -150,10 +150,11 @@ class GatkPipeline(val root: Configurable) extends QScript with MultiSampleQScri override def configPath: List[String] = super.configPath ::: "multisample" :: Nil } - def biopetScript() { - addSamplesJobs + def biopetScript(): Unit = { + addSamplesJobs() + } - //SampleWide jobs + def addMultiSampleJobs(): Unit = { val gvcfFiles: List[File] = if (mergeGvcfs && externalGvcfs.size + samples.size > 1) { val newFile = outputDir + "merged.gvcf.vcf.gz" add(CombineGVCFs(this, externalGvcfs ++ samples.map(_._2.gatkVariantcalling.scriptOutput.gvcfFile), newFile)) diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala index 67f108b3ae0eac140729632d703d5f533862054f..0217615d1bedf61bdac37f878f7f1fcdf698b0ec 100644 --- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala +++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/MultiSampleQScript.scala @@ -26,7 +26,7 @@ import org.broadinstitute.gatk.utils.commandline.{ Argument } */ trait MultiSampleQScript extends BiopetQScript { @Argument(doc = "Only Sample", shortName = "sample", required = false) - val onlySample: List[String] = Nil + private val onlySamples: List[String] = Nil require(Config.global.map.contains("samples"), "No Samples found in config") @@ -94,7 +94,7 @@ trait MultiSampleQScript extends BiopetQScript { protected def addJobs() /** function add all libraries in one call */ - protected final def addLibsJobs(): Unit = { + protected final def addPerLibJobs(): Unit = { for ((libraryId, library) <- libraries) { library.addAndTrackJobs() } @@ -125,17 +125,24 @@ trait MultiSampleQScript extends BiopetQScript { val samples: Map[String, Sample] = sampleIds.map(id => id -> makeSample(id)).toMap /** Returns a list of all sampleIDs */ - protected def sampleIds: Set[String] = if (onlySample != Nil) onlySample.toSet else { - ConfigUtils.any2map(Config.global.map("samples")).keySet - } + protected def sampleIds: Set[String] = ConfigUtils.any2map(Config.global.map("samples")).keySet /** Runs addAndTrackJobs method for each sample */ final def addSamplesJobs() { - for ((sampleId, sample) <- samples) { - sample.addAndTrackJobs() - } + if (onlySamples.isEmpty) { + samples.foreach { case (sampleId, sample) => sample.addAndTrackJobs() } + addMultiSampleJobs() + } else onlySamples.foreach(sampleId => samples.get(sampleId) match { + case Some(sample) => sample.addAndTrackJobs() + case None => logger.warn("sampleId '" + sampleId + "' not found") + }) } + /** + * Method where the multisample jobs should be added, this will be executed only when running the -sample argument is not given + */ + def addMultiSampleJobs() + /** Stores sample state */ private var currentSample: Option[String] = None diff --git a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala index 1ccf16f428e6cd2482648f4e9f2cc030696c9799..271c06085ddd086a5f015c88d84e29a008272c89 100644 --- a/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala +++ b/public/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/pipelines/MultisamplePipelineTemplate.scala @@ -37,6 +37,9 @@ class MultisamplePipelineTemplate(val root: Configurable) extends QScript with M } } + def addMultiSampleJobs(): Unit = { + } + def init(): Unit = { } diff --git a/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala b/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala index cd883186af6bc835ce278887f9beacda29acdf42..b06c01f57488b2a8a1b4dd493ab9d47625a4d206 100644 --- a/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala +++ b/public/carp/src/main/scala/nl/lumc/sasc/biopet/pipelines/carp/Carp.scala @@ -67,7 +67,7 @@ class Carp(val root: Configurable) extends QScript with MultiSampleQScript { val controls: List[String] = config("control", default = Nil) def addJobs(): Unit = { - addLibsJobs() + addPerLibJobs() val bamFiles = libraries.map(_._2.mapping.finalBamFile).toList if (bamFiles.length == 1) { add(Ln(qscript, bamFiles.head, bamFile)) @@ -102,8 +102,10 @@ class Carp(val root: Configurable) extends QScript with MultiSampleQScript { // Third step is calling peaks on the bam files produced with the mapping pipeline, this will be done with MACS2 logger.info("Starting CArP pipeline") - addSamplesJobs + addSamplesJobs() + } + def addMultiSampleJobs(): Unit = { for ((sampleId, sample) <- samples) { for (controlId <- sample.controls) { if (!samples.contains(controlId)) diff --git a/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala b/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala index 3b503759c6979faa83fac1fc7608bb557cb1c20f..5360b4ac78824c2e26649a12e1cc3c35262a8b50 100644 --- a/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala +++ b/public/kopisu/src/main/scala/nl/lumc/sasc/biopet/pipelines/kopisu/Kopisu.scala @@ -25,31 +25,29 @@ class Kopisu(val root: Configurable) extends QScript with MultiSampleQScript { @Input(doc = "Input bamfile", required = true) var bamFile: File = config("bam") - class LibraryOutput extends AbstractLibraryOutput { - } - - class SampleOutput extends AbstractSampleOutput { - } - def init() { if (!outputDir.endsWith("/")) outputDir += "/" } def biopetScript() { - runSamplesJobs + addSamplesJobs() } - // Called for each sample - def runSingleSampleJobs(sampleConfig: Map[String, Any]): SampleOutput = { - val sampleOutput = new SampleOutput + def makeSample(id: String) = new Sample(id) + class Sample(sampleId: String) extends AbstractSample(sampleId) { + def makeLibrary(id: String) = new Library(id) + class Library(libraryId: String) extends AbstractLibrary(libraryId) { + def addJobs(): Unit = { + + } + } + + def addJobs(): Unit = { - return sampleOutput + } } - // Called for each run from a sample - def runSingleLibraryJobs(runConfig: Map[String, Any], sampleConfig: Map[String, Any]): LibraryOutput = { - val libraryOutput = new LibraryOutput - return libraryOutput + def addMultiSampleJobs(): Unit = { } } 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 851e8481c5da2eff863760e1a9dfcaef180cc369..03be2ded6a42a0845830fcfd27ff1d119a3326c4 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 @@ -103,7 +103,7 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript { } protected def addJobs(): Unit = { - addLibsJobs() + addPerLibJobs() val libraryBamfiles = libraries.map(_._2.mapping.finalBamFile).toList val libraryFastqFiles = libraries.map(_._2.prefixFastq).toList @@ -151,7 +151,10 @@ class Sage(val root: Configurable) extends QScript with MultiSampleQScript { tagsLibrary = cdl.output } - addSamplesJobs + addSamplesJobs() + } + + def addMultiSampleJobs(): Unit = { } def addBedtoolsCounts(bamFile: File, outputPrefix: String, outputDir: String) {