2010-05-24 04:21:09 +08:00
package org.broadinstitute.sting.queue
2010-08-10 00:42:48 +08:00
import java.io.File
import java.util.Arrays
import org.broadinstitute.sting.queue.engine.QGraph
import org.broadinstitute.sting.queue.util. { Logging , ScalaCompoundArgumentTypeDescriptor }
2010-08-12 05:58:26 +08:00
import org.broadinstitute.sting.commandline._
2010-05-24 04:21:09 +08:00
2010-08-10 00:42:48 +08:00
/* *
* Entry point of Queue . Compiles and runs QScripts passed in to the command line .
*/
class QCommandLine extends CommandLineProgram with Logging {
@Input ( fullName = "script" , shortName = "S" , doc = "QScript scala file" , required = true )
@ClassType ( classOf [ File ] )
private var scripts = List . empty [ File ]
2010-05-24 04:21:09 +08:00
2010-08-10 00:42:48 +08:00
@Argument ( fullName = "bsub_all_jobs" , shortName = "bsub" , doc = "Use bsub to submit jobs" , required = false )
private var bsubAllJobs = false
@Argument ( fullName = "bsub_wait_jobs" , shortName = "bsubWait" , doc = "Wait for bsub submitted jobs before exiting" , required = false )
private var bsubWaitJobs = false
2010-08-12 05:58:26 +08:00
@Argument ( fullName = "run_scripts" , shortName = "run" , doc = "Run QScripts. Without this flag set only performs a dry run." , required = false )
2010-08-10 00:42:48 +08:00
private var run = false
2010-05-24 04:21:09 +08:00
2010-08-10 00:42:48 +08:00
@Argument ( fullName = "dot_graph" , shortName = "dot" , doc = "Outputs the queue graph to a .dot file. See: http://en.wikipedia.org/wiki/DOT_language" , required = false )
2010-08-12 05:58:26 +08:00
private var dotFile : File = _
@Argument ( fullName = "expanded_dot_graph" , shortName = "expandedDot" , doc = "Outputs the queue graph of scatter gather to a .dot file. Otherwise overwrites the dot_graph" , required = false )
private var expandedDotFile : File = _
@Argument ( fullName = "skip_up_to_date" , shortName = "skipUpToDate" , doc = "Does not run command line functions that don't depend on other jobs if the outputs exist and are older than the inputs." , required = false )
private var skipUpToDate = false
@Argument ( fullName = "for_reals" , shortName = "forReals" , doc = "Run QScripts" , required = false ) @Hidden
private var runScripts = false
@ArgumentCollection
private val qSettings = new QSettings
2010-05-24 04:21:09 +08:00
2010-08-10 00:42:48 +08:00
/* *
* Takes the QScripts passed in , runs their script ( ) methods , retrieves their generated
* functions , and then builds and runs a QGraph based on the dependencies .
*/
def execute = {
val qGraph = new QGraph
2010-08-12 05:58:26 +08:00
qGraph . dryRun = ! ( run || runScripts )
2010-08-10 00:42:48 +08:00
qGraph . bsubAllJobs = bsubAllJobs
qGraph . bsubWaitJobs = bsubWaitJobs
2010-08-12 05:58:26 +08:00
qGraph . skipUpToDateJobs = skipUpToDate
qGraph . dotFile = dotFile
qGraph . expandedDotFile = expandedDotFile
qGraph . qSettings = qSettings
2010-08-10 00:42:48 +08:00
val scripts = qScriptManager . createScripts ( )
for ( script <- scripts ) {
logger . info ( "Scripting " + qScriptManager . getName ( script . getClass . asSubclass ( classOf [ QScript ] ) ) )
loadArgumentsIntoObject ( script )
script . script
script . functions . foreach ( qGraph . add ( _ ) )
logger . info ( "Added " + script . functions . size + " functions" )
2010-05-24 04:21:09 +08:00
}
2010-08-10 00:42:48 +08:00
logger . info ( "Running generated graph" )
qGraph . run
2010-08-12 05:58:26 +08:00
2010-08-10 00:42:48 +08:00
logger . info ( "Done" )
0
}
/* *
* Returns true as QScripts are located and compiled .
* @return true
*/
override def canAddArgumentsDynamically = true
/* *
* Returns the list of QScripts passed in via - S so that their
* arguments can be inspected before QScript . script is called .
* @return Array of QScripts passed in .
*/
override def getArgumentSources =
qScriptManager . getValues . asInstanceOf [ Array [ Class [ _ ] ] ]
2010-05-26 06:52:29 +08:00
2010-08-10 00:42:48 +08:00
/* *
* Returns the name of a QScript
* @return The name of a QScript
*/
override def getArgumentSourceName ( source : Class [ _ ] ) =
qScriptManager . getName ( source . asSubclass ( classOf [ QScript ] ) )
/* *
* Returns a ScalaCompoundArgumentTypeDescriptor that can parse argument sources into scala collections .
* @return a ScalaCompoundArgumentTypeDescriptor
*/
override def getArgumentTypeDescriptors =
Arrays . asList ( new ScalaCompoundArgumentTypeDescriptor )
/* *
* Loads the QScripts passed in and returns a new QScriptManager than can be used to create them .
*/
private lazy val qScriptManager = {
QScriptManager . loadScripts ( scripts )
new QScriptManager
}
}
/* *
* Entry point of Queue . Compiles and runs QScripts passed in to the command line .
*/
object QCommandLine {
/* *
* Main .
* @param argv Arguments .
*/
def main ( argv : Array [ String ] ) {
try {
CommandLineProgram . start ( new QCommandLine , argv ) ;
if ( CommandLineProgram . result != 0 )
System . exit ( CommandLineProgram . result ) ;
} catch {
case e : Exception => CommandLineProgram . exitSystemWithError ( e )
}
2010-05-24 04:21:09 +08:00
}
}