diff --git a/build.xml b/build.xml index 6da364e26..cfb912937 100644 --- a/build.xml +++ b/build.xml @@ -110,6 +110,7 @@ + @@ -196,7 +197,7 @@ - + diff --git a/ivy.xml b/ivy.xml index f245cd81d..bbf4d9c19 100644 --- a/ivy.xml +++ b/ivy.xml @@ -7,6 +7,6 @@ - + diff --git a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java index 6c14df22e..591b29287 100644 --- a/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java +++ b/java/src/org/broadinstitute/sting/gatk/GenomeAnalysisTK.java @@ -12,6 +12,7 @@ import org.broadinstitute.sting.gatk.refdata.rodDbSNP; import org.broadinstitute.sting.gatk.refdata.rodGFF; import org.broadinstitute.sting.gatk.walkers.LocusWalker; import org.broadinstitute.sting.gatk.walkers.ReadWalker; +import org.broadinstitute.sting.gatk.walkers.Walker; import org.broadinstitute.sting.utils.FastaSequenceFile2; import org.broadinstitute.sting.utils.GenomeLoc; import org.broadinstitute.sting.utils.Utils; @@ -42,6 +43,7 @@ public class GenomeAnalysisTK extends CommandLineProgram { // our walker manager private WalkerManager walkerManager = null; + private Walker my_walker = null; public String pluginPathName = null; private TraversalEngine engine = null; @@ -60,12 +62,12 @@ public class GenomeAnalysisTK extends CommandLineProgram { * Flags don't take an argument, the associated Boolean gets set to true if the flag appears on the command line. */ protected void setupArgs() { - m_parser.addRequiredlArg("input_file", "I", "SAM or BAM file for validation", "INPUT_FILE"); + m_parser.addRequiredArg("input_file", "I", "SAM or BAM file for validation", "INPUT_FILE"); m_parser.addOptionalArg("maximum_reads", "M", "Maximum number of reads to process before exiting", "MAX_READS_ARG"); m_parser.addOptionalArg("validation_strictness", "S", "How strict should we be with validation", "STRICTNESS_ARG"); m_parser.addOptionalArg("reference_sequence", "R", "Reference sequence file", "REF_FILE_ARG"); m_parser.addOptionalArg("genome_region", "L", "Genome region to operation on: from chr:start-end", "REGION_STR"); - m_parser.addRequiredlArg("analysis_type", "T", "Type of analysis to run", "Analysis_Name"); + m_parser.addRequiredArg("analysis_type", "T", "Type of analysis to run", "Analysis_Name"); m_parser.addOptionalArg("DBSNP", "D", "DBSNP file", "DBSNP_FILE"); m_parser.addOptionalArg("Hapmap", "H", "Hapmap file", "HAPMAP_FILE"); m_parser.addOptionalFlag("threaded_IO", "P", "If set, enables threaded I/O operations", "ENABLED_THREADED_IO"); @@ -74,6 +76,32 @@ public class GenomeAnalysisTK extends CommandLineProgram { m_parser.addOptionalArg("intervals_file", "V", "File containing list of genomic intervals to operate on. line := ", "INTERVALS_FILE"); } + /** + * GATK can add arguments dynamically based on analysis type. + * @return true + */ + @Override + protected boolean canAddArgumentsDynamically() { return true; } + + /** + * GATK provides the walker as an argument source. As a side-effect, initializes the walker variable. + * @return List of walkers to load dynamically. + */ + @Override + protected Object[] getArgumentSources() { + if( Analysis_Name == null ) + throw new IllegalArgumentException("Must provide analysis name"); + + walkerManager = new WalkerManager( pluginPathName ); + + if( !walkerManager.doesWalkerExist(Analysis_Name) ) + throw new IllegalArgumentException("Invalid analysis name"); + + my_walker = walkerManager.getWalkerByName(Analysis_Name); + + return new Object[] { my_walker }; + } + /** * Required main method implementation. */ @@ -82,10 +110,6 @@ public class GenomeAnalysisTK extends CommandLineProgram { } protected int execute() { - - - walkerManager = new WalkerManager(pluginPathName); - final boolean TEST_ROD = false; List rods = new ArrayList(); @@ -155,15 +179,10 @@ public class GenomeAnalysisTK extends CommandLineProgram { //LocusWalker walker = new PileupWalker(); - // Try to get the walker specified - Object my_walker; - if (walkerManager.doesWalkerExist(Analysis_Name)) { - my_walker = walkerManager.getWalkerByName(Analysis_Name); - } else { - logger.fatal("Could not find walker " + Analysis_Name); - return 0; - } + if( my_walker == null ) + throw new RuntimeException( "Sanity check failed -- no walker present." ); + // Try to get the walker specified try { LocusWalker walker = (LocusWalker) my_walker; if ( INTERVALS_FILE == null ) diff --git a/java/src/org/broadinstitute/sting/gatk/WalkerManager.java b/java/src/org/broadinstitute/sting/gatk/WalkerManager.java index a26ff32b5..0feb0854e 100755 --- a/java/src/org/broadinstitute/sting/gatk/WalkerManager.java +++ b/java/src/org/broadinstitute/sting/gatk/WalkerManager.java @@ -5,6 +5,7 @@ import net.sf.functionalj.reflect.JdkStdReflect; import net.sf.functionalj.FunctionN; import net.sf.functionalj.Functions; +import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.io.File; import java.io.FilenameFilter; @@ -20,6 +21,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import org.broadinstitute.sting.gatk.walkers.Walker; +import org.broadinstitute.sting.utils.cmdLine.Argument; /** * Created by IntelliJ IDEA. @@ -88,7 +90,8 @@ public class WalkerManager { * @return The walker object if found; null otherwise. */ public Walker getWalkerByName(String walkerName) { - return walkers.get(walkerName); + Walker walker = walkers.get(walkerName); + return walker; } /** diff --git a/java/src/org/broadinstitute/sting/utils/cmdLine/Argument.java b/java/src/org/broadinstitute/sting/utils/cmdLine/Argument.java new file mode 100755 index 000000000..8f117b535 --- /dev/null +++ b/java/src/org/broadinstitute/sting/utils/cmdLine/Argument.java @@ -0,0 +1,26 @@ +package org.broadinstitute.sting.utils.cmdLine; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by IntelliJ IDEA. + * User: hanna + * Date: Mar 24, 2009 + * Time: 11:11:36 AM + * To change this template use File | Settings | File Templates. + */ +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface Argument { + String fullName() default ""; + String shortName() default ""; + String doc() default ""; + boolean required() default true; +} diff --git a/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java b/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java index d171379bd..9ec2abc27 100644 --- a/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java +++ b/java/src/org/broadinstitute/sting/utils/cmdLine/ArgumentParser.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import org.broadinstitute.sting.utils.Pair; + /** * User: aaron * Date: Mar 19, 2009 @@ -33,7 +35,7 @@ public class ArgumentParser { private ArrayList m_option_names = new ArrayList(); // where we eventually want the values to land - private HashMap m_storageLocations = new HashMap(); + private HashMap> m_storageLocations = new HashMap>(); // create Options object protected Options m_options = new Options(); @@ -100,7 +102,18 @@ public class ArgumentParser { * @param opt the option */ private void AddToOptionStorage(String name, String letterform, String fieldname, Option opt) { + AddToOptionStorage(name, letterform, getField(prog, fieldname), opt); + } + /** + * Used locally to add to the options storage we have, for latter processing + * + * @param name the name of the option + * @param letterform it's short form + * @param field what field it should be stuck into on the calling class + * @param opt the option + */ + private void AddToOptionStorage(String name, String letterform, Pair field, Option opt) { // add to the option list m_options.addOption(opt); @@ -110,20 +123,23 @@ public class ArgumentParser { } // add the object with it's name to the storage location - try { - m_storageLocations.put(name, prog.getClass().getField(fieldname)); - } catch (NoSuchFieldException e) { - logger.fatal("Failed to find the field specified by the fieldname parameter."); - throw new RuntimeException(e.getMessage()); - } + m_storageLocations.put( name, field ); // add to the list of m_options m_option_names.add(letterform); } - + private Pair getField( Object obj, String fieldName ) { + try { + return new Pair( obj, obj.getClass().getField(fieldName) ); + } catch (NoSuchFieldException e) { + logger.fatal("Failed to find the field specified by the fieldname parameter."); + throw new RuntimeException(e.getMessage()); + } + } + /** - * addRequiredlArg + * addRequiredArg *

* Adds a required argument to check on the command line * @@ -132,7 +148,7 @@ public class ArgumentParser { * @param description the description of the argument * @param fieldname what field it should be stuck into on the calling class */ - public void addRequiredlArg(String name, String letterform, String description, String fieldname) { + public void addRequiredArg(String name, String letterform, String description, String fieldname) { // we always want the help option to be available Option opt = OptionBuilder.isRequired() .withLongOpt(name) @@ -169,7 +185,7 @@ public class ArgumentParser { /** - * addRequiredlArg + * addRequiredArg *

* Adds a required argument to check on the command line * @@ -178,7 +194,7 @@ public class ArgumentParser { * @param description the description of the argument * @param fieldname what field it should be stuck into on the calling class */ - public void addRequiredlArgList(String name, String letterform, String description, String fieldname) { + public void addRequiredArgList(String name, String letterform, String description, String fieldname) { // we always want the help option to be available Option opt = OptionBuilder.isRequired() @@ -226,7 +242,7 @@ public class ArgumentParser { /** - * addRequiredlFlag + * addRequiredFlag *

* Adds a required argument to check on the command line * @@ -235,7 +251,7 @@ public class ArgumentParser { * @param description the description of the argument * @param fieldname what field it should be stuck into on the calling class */ - public void addRequiredlFlag(String name, String letterform, String description, String fieldname) { + public void addRequiredFlag(String name, String letterform, String description, String fieldname) { // if they've passed a non-Boolean as a object, beat them try { @@ -254,7 +270,6 @@ public class ArgumentParser { // add it to the option AddToOptionStorage(name, letterform, fieldname, opt); - } @@ -265,45 +280,87 @@ public class ArgumentParser { * * @param args the command line arguments we recieved */ - public void processArgs(String[] args) throws ParseException { - CommandLineParser parser = new PosixParser(); + public void processArgs(String[] args, boolean allowUnrecognized) throws ParseException { + OurPosixParser parser = new OurPosixParser(); + Collection