diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/CallsetConcordanceWalker.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/CallsetConcordanceWalker.java index ee1bff412..76c25fdce 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/CallsetConcordanceWalker.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/CallsetConcordanceWalker.java @@ -26,32 +26,23 @@ public class CallsetConcordanceWalker extends RefWalker { private ArrayList requestedTypes; - private HashMap initializeConcordanceTypes(String prefix) { - HashMap types = new HashMap(); - - // - // Add new concordance types here! - // - types.put("SNPGenotypeConcordance", new SNPGenotypeConcordance(prefix)); - types.put("SimpleVenn", new SimpleVenn(prefix)); - types.put("IndelSubsets", new IndelSubsets(prefix)); - - return types; - } - /** * Prepare the output file and the list of available features. */ public void initialize() { - HashMap concordanceTypes = initializeConcordanceTypes(OUTPUT_PATH); + // get the possible concordance types + List> classes = PackageUtils.getClassesImplementingInterface(ConcordanceType.class); + + // print and exit if that's what was requested if (LIST_ONLY) { - Iterator types = concordanceTypes.keySet().iterator(); out.println("\nAvailable concordance types:"); - while ( types.hasNext() ) - out.println("\t" + types.next()); + for (int i = 0; i < classes.size(); i++) + out.println("\t" + classes.get(i).getSimpleName()); + out.println(); System.exit(0); } + requestedTypes = new ArrayList(); // initialize requested concordance types @@ -59,22 +50,37 @@ public class CallsetConcordanceWalker extends RefWalker { for ( String requestedTypeString : TYPES ) { String[] requestedPieces = requestedTypeString.split(":"); String requestedType = requestedPieces[0]; - ConcordanceType type = concordanceTypes.get(requestedType); - if ( type == null ) - throw new StingException("The requested concordance type (" + requestedType + ") isn't a valid option"); - HashMap requestedArgs = new HashMap(); - if ( requestedPieces.length == 2 ) { - String[] argStrings = requestedPieces[1].split(","); - for (int i = 0; i < argStrings.length; i++ ) { - String[] arg = argStrings[i].split("="); - if ( arg.length == 2 ) - requestedArgs.put(arg[0], arg[1]); + boolean foundClass = false; + for ( Class type : classes ) { + + if (requestedType.equalsIgnoreCase(type.getSimpleName())) { + foundClass = true; + try { + ConcordanceType concordance = (ConcordanceType)type.newInstance(); + HashMap requestedArgs = new HashMap(); + if ( requestedPieces.length == 2 ) { + String[] argStrings = requestedPieces[1].split(","); + for (int i = 0; i < argStrings.length; i++ ) { + String[] arg = argStrings[i].split("="); + if ( arg.length == 2 ) + requestedArgs.put(arg[0], arg[1]); + } + } + + concordance.initialize(OUTPUT_PATH, requestedArgs); + requestedTypes.add(concordance); + break; + } catch (InstantiationException e) { + throw new StingException(String.format("Cannot instantiate concordance class '%s': must be concrete class", type.getSimpleName())); + } catch (IllegalAccessException e) { + throw new StingException(String.format("Cannot instantiate concordance class '%s': must have no-arg constructor", type.getSimpleName())); + } } } - type.initialize(requestedArgs); - requestedTypes.add(type); + if ( !foundClass ) + throw new StingException("The requested concordance type (" + requestedType + ") isn't a valid concordance option"); } } } diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/ConcordanceType.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/ConcordanceType.java index 827abb8e6..4222b721a 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/ConcordanceType.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/ConcordanceType.java @@ -7,7 +7,7 @@ import java.util.HashMap; public interface ConcordanceType { - public void initialize(HashMap args); + public void initialize(String prefix, HashMap args); public void computeConcordance(RefMetaDataTracker tracker, ReferenceContext ref); public void cleanup(); diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/IndelSubsets.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/IndelSubsets.java index 940b66de7..e8dd38f19 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/IndelSubsets.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/IndelSubsets.java @@ -23,13 +23,10 @@ public class IndelSubsets implements ConcordanceType { private int sizeCutoff = 2; private PrintWriter[][][][] writers = new PrintWriter[2][2][2][2]; - private String prefix; - public IndelSubsets(String prefix) { - this.prefix = prefix; - } + public IndelSubsets() {} - public void initialize(HashMap args) { + public void initialize(String prefix, HashMap args) { if ( args.get("sizeCutoff") != null ) sizeCutoff = Integer.valueOf(args.get("sizeCutoff")); if ( args.get("homopolymerCutoff") != null ) diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SNPGenotypeConcordance.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SNPGenotypeConcordance.java index 724f3c514..147f69d5d 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SNPGenotypeConcordance.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SNPGenotypeConcordance.java @@ -28,13 +28,10 @@ public class SNPGenotypeConcordance implements ConcordanceType { private PrintWriter comboVarWriter = null; private PrintWriter coverageVar1Writer = null; private PrintWriter coverageVar2Writer = null; - private String prefix; - public SNPGenotypeConcordance(String prefix) { - this.prefix = prefix; - } + public SNPGenotypeConcordance() {} - public void initialize(HashMap args) { + public void initialize(String prefix, HashMap args) { try { sameVarWriter = new PrintWriter(prefix + ".snp_concordance.sameConfidentVariant.calls"); oneVarWriter = new PrintWriter(prefix + ".snp_concordance.bothVariantOnlyOneIsConfident.calls"); diff --git a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SimpleVenn.java b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SimpleVenn.java index 7e3247824..f6de692d8 100755 --- a/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SimpleVenn.java +++ b/java/src/org/broadinstitute/sting/playground/gatk/walkers/concordance/SimpleVenn.java @@ -21,13 +21,10 @@ public class SimpleVenn implements ConcordanceType { private PrintWriter discord_writer = null; private PrintWriter set1_writer = null; private PrintWriter set2_writer = null; - private String prefix; - public SimpleVenn(String prefix) { - this.prefix = prefix; - } + public SimpleVenn() {} - public void initialize(HashMap args) { + public void initialize(String prefix, HashMap args) { try { union_writer = new PrintWriter(prefix + ".venn.union.calls"); intersect_writer = new PrintWriter(prefix + ".venn.intersection.calls");