Using picard for bam merging.
Properties now propagate to scatter/gather functions. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3659 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
62d22ff1aa
commit
c047232b18
|
|
@ -12,7 +12,7 @@ class QArguments(args: Array[String]) {
|
||||||
var dryRun = false
|
var dryRun = false
|
||||||
val scripts = new ListBuffer[String]
|
val scripts = new ListBuffer[String]
|
||||||
var inputPaths = List.empty[File]
|
var inputPaths = List.empty[File]
|
||||||
var argMap = Map.empty[String, String]
|
var properties = Map.empty[String, String]
|
||||||
|
|
||||||
val userArgs = parseArgs(args)
|
val userArgs = parseArgs(args)
|
||||||
|
|
||||||
|
|
@ -29,7 +29,7 @@ class QArguments(args: Array[String]) {
|
||||||
if (isFlagged(filtered, "-bsub"))
|
if (isFlagged(filtered, "-bsub"))
|
||||||
bsubAllJobs = true
|
bsubAllJobs = true
|
||||||
for (arg <- getArgs(filtered, "-P"))
|
for (arg <- getArgs(filtered, "-P"))
|
||||||
addArg(arg)
|
addProperties(arg)
|
||||||
for (arg <- getArgs(filtered, "-I"))
|
for (arg <- getArgs(filtered, "-I"))
|
||||||
addFile(arg)
|
addFile(arg)
|
||||||
for (arg <- getArgs(filtered, "-S"))
|
for (arg <- getArgs(filtered, "-S"))
|
||||||
|
|
@ -64,18 +64,18 @@ class QArguments(args: Array[String]) {
|
||||||
found
|
found
|
||||||
}
|
}
|
||||||
|
|
||||||
def addArg(arg: String) = {
|
def addProperties(arg: String) = {
|
||||||
var file = new File(arg)
|
var file = new File(arg)
|
||||||
if (arg.contains("=") && !file.exists) {
|
if (arg.contains("=") && !file.exists) {
|
||||||
val tokens = arg.split("=", 2)
|
val tokens = arg.split("=", 2)
|
||||||
argMap += tokens(0) -> tokens(1)
|
properties += tokens(0) -> tokens(1)
|
||||||
} else if (arg.endsWith(".properties")) {
|
} else if (arg.endsWith(".properties")) {
|
||||||
if (!file.exists)
|
if (!file.exists)
|
||||||
throw new QException("File not found: " + file.getAbsolutePath)
|
throw new QException("File not found: " + file.getAbsolutePath)
|
||||||
var props = new Properties
|
var props = new Properties
|
||||||
props.load(new FileInputStream(file))
|
props.load(new FileInputStream(file))
|
||||||
for ((name, value) <- props)
|
for ((name, value) <- props)
|
||||||
argMap += name -> value
|
properties += name -> value
|
||||||
} else {
|
} else {
|
||||||
throw new QException("Invalid property: " + arg)
|
throw new QException("Invalid property: " + arg)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ object QScript {
|
||||||
* Sets the @Input and @Output values for a single function
|
* Sets the @Input and @Output values for a single function
|
||||||
*/
|
*/
|
||||||
def setParams(function: CommandLineFunction): Unit =
|
def setParams(function: CommandLineFunction): Unit =
|
||||||
for ((name, value) <- qArgs.argMap) function.addOrUpdateWithStringValue(name, value)
|
function.properties = qArgs.properties
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes functions that have been added to the pipeline.
|
* Executes functions that have been added to the pipeline.
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,19 @@ import java.lang.annotation.Annotation
|
||||||
import org.broadinstitute.sting.commandline.{Input, Output, ArgumentDescription}
|
import org.broadinstitute.sting.commandline.{Input, Output, ArgumentDescription}
|
||||||
|
|
||||||
trait CommandLineFunction extends InputOutputFunction with DispatchFunction {
|
trait CommandLineFunction extends InputOutputFunction with DispatchFunction {
|
||||||
|
var properties = Map.empty[String, String]
|
||||||
|
|
||||||
def inputFieldsWithValues = inputFields.filter(hasFieldValue(_))
|
def inputFieldsWithValues = inputFields.filter(hasFieldValue(_))
|
||||||
def outputFieldsWithValues = outputFields.filter(hasFieldValue(_))
|
def outputFieldsWithValues = outputFields.filter(hasFieldValue(_))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets parameters from the arg map.
|
||||||
|
*/
|
||||||
|
override def freeze = {
|
||||||
|
for ((name, value) <- properties) addOrUpdateWithStringValue(name, value)
|
||||||
|
super.freeze
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Repeats parameters with a prefix/suffix if they are set otherwise returns "".
|
* Repeats parameters with a prefix/suffix if they are set otherwise returns "".
|
||||||
* Skips null, Nil, None. Unwraps Some(x) to x. Everything else is called with x.toString.
|
* Skips null, Nil, None. Unwraps Some(x) to x. Everything else is called with x.toString.
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,10 @@ trait InputOutputFunction extends QFunction with Cloneable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a field value using the name of the field.
|
* Sets a field value using the name of the field.
|
||||||
* Field must be annotated with @Input, @Output, or @Internal
|
* Field must be annotated with @Input or @Output
|
||||||
* @return true if the value was found and set
|
* @return true if the value was found and set
|
||||||
*/
|
*/
|
||||||
def addOrUpdateWithStringValue(name: String, value: String) = {
|
protected def addOrUpdateWithStringValue(name: String, value: String) = {
|
||||||
fields.find(_.getName == name) match {
|
fields.find(_.getName == name) match {
|
||||||
case Some(field) =>
|
case Some(field) =>
|
||||||
val isInput = ReflectionUtils.hasAnnotation(field, classOf[Input])
|
val isInput = ReflectionUtils.hasAnnotation(field, classOf[Input])
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,17 @@
|
||||||
package org.broadinstitute.sting.queue.function.scattergather
|
package org.broadinstitute.sting.queue.function.scattergather
|
||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import org.broadinstitute.sting.commandline.Input
|
||||||
|
|
||||||
class BamGatherFunction extends GatherFunction {
|
class BamGatherFunction extends GatherFunction {
|
||||||
type GatherType = File
|
type GatherType = File
|
||||||
|
|
||||||
def commandLine = "samtools merge %s%s".format(originalOutput, repeat(" ", gatherParts))
|
@Input(doc="Picard MergeSamFiles.jar. At the Broad this can be found at /seq/software/picard/current/bin/MergeSamFiles.jar. Outside the broad see http://picard.sourceforge.net/")
|
||||||
|
var picardMergeSamFilesJar: String = _
|
||||||
|
|
||||||
|
@Input(doc="Compression level 1-9", required=false)
|
||||||
|
var picardMergeCompressionLevel: Option[Int] = None
|
||||||
|
|
||||||
|
def commandLine = "java -jar %s%s%s%s".format(picardMergeSamFilesJar,
|
||||||
|
optional(" COMPRESSION_LEVEL=", picardMergeCompressionLevel), " OUTPUT=" + originalOutput, repeat(" INPUT=", gatherParts))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ object ScatterGatherableFunction {
|
||||||
|
|
||||||
// Create a function that will remove any temporary items
|
// Create a function that will remove any temporary items
|
||||||
var cleanupFunction = new CleanupTempDirsFunction
|
var cleanupFunction = new CleanupTempDirsFunction
|
||||||
|
cleanupFunction.properties = originalFunction.properties
|
||||||
cleanupFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
cleanupFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
||||||
cleanupFunction.commandDirectory = originalFunction.commandDirectory
|
cleanupFunction.commandDirectory = originalFunction.commandDirectory
|
||||||
|
|
||||||
|
|
@ -42,6 +43,7 @@ object ScatterGatherableFunction {
|
||||||
// Create the scatter function based on @Scatter
|
// Create the scatter function based on @Scatter
|
||||||
val scatterFunction = getScatterFunction(scatterField)
|
val scatterFunction = getScatterFunction(scatterField)
|
||||||
scatterFunction.setOriginalFunction(originalFunction)
|
scatterFunction.setOriginalFunction(originalFunction)
|
||||||
|
scatterFunction.properties = originalFunction.properties
|
||||||
scatterFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
scatterFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
||||||
scatterFunction.commandDirectory = originalFunction.temp("scatter-" + scatterField.getName)
|
scatterFunction.commandDirectory = originalFunction.temp("scatter-" + scatterField.getName)
|
||||||
scatterFunction.originalInput = originalValue.asInstanceOf[scatterFunction.ScatterType]
|
scatterFunction.originalInput = originalValue.asInstanceOf[scatterFunction.ScatterType]
|
||||||
|
|
@ -55,6 +57,7 @@ object ScatterGatherableFunction {
|
||||||
// Create the gather function based on @Gather
|
// Create the gather function based on @Gather
|
||||||
val gatherFunction = getGatherFunction(outputField)
|
val gatherFunction = getGatherFunction(outputField)
|
||||||
gatherFunction.setOriginalFunction(originalFunction)
|
gatherFunction.setOriginalFunction(originalFunction)
|
||||||
|
gatherFunction.properties = originalFunction.properties
|
||||||
gatherFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
gatherFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
||||||
gatherFunction.commandDirectory = originalFunction.temp("gather-" + outputField.getName)
|
gatherFunction.commandDirectory = originalFunction.temp("gather-" + outputField.getName)
|
||||||
|
|
||||||
|
|
@ -96,6 +99,7 @@ object ScatterGatherableFunction {
|
||||||
// Create a function to create all of the temp directories.
|
// Create a function to create all of the temp directories.
|
||||||
// All of its inputs are the inputs of the original function.
|
// All of its inputs are the inputs of the original function.
|
||||||
val initializeFunction = new CreateTempDirsFunction
|
val initializeFunction = new CreateTempDirsFunction
|
||||||
|
initializeFunction.properties = originalFunction.properties
|
||||||
initializeFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
initializeFunction.jobNamePrefix = originalFunction.jobNamePrefix
|
||||||
initializeFunction.commandDirectory = originalFunction.commandDirectory
|
initializeFunction.commandDirectory = originalFunction.commandDirectory
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue