diff --git a/public/java/src/org/broadinstitute/sting/commandline/RodBinding.java b/public/java/src/org/broadinstitute/sting/commandline/RodBinding.java index b39e0d7ba..23acc2a78 100644 --- a/public/java/src/org/broadinstitute/sting/commandline/RodBinding.java +++ b/public/java/src/org/broadinstitute/sting/commandline/RodBinding.java @@ -54,41 +54,13 @@ public class RodBinding { public String getVariableName() { return variableName; } - + public Class getType() { + return type; + } public String getSource() { return source; } - // ------------------------------------------------------------------------------------------ - // - // - // Accessors should be kept in sync with RefMetaDataTracker - // - // - // ------------------------------------------------------------------------------------------ - - public List getValues(final RefMetaDataTracker tracker) { - return tracker.getValues(type, getVariableName()); - } - public List getValues(final RefMetaDataTracker tracker, final GenomeLoc onlyAtThisLoc) { - return tracker.getValues(type, getVariableName(), onlyAtThisLoc); - } - - public T getFirstValue(final RefMetaDataTracker tracker) { - return tracker.getFirstValue(type, getVariableName()); - } - public T getFirstValue(final RefMetaDataTracker tracker, final GenomeLoc onlyAtThisLoc) { - return tracker.getFirstValue(type, getVariableName(), onlyAtThisLoc); - } - - public boolean hasValues(final RefMetaDataTracker tracker) { - return tracker.hasValues(variableName); - } - - public List getValuesAsGATKFeatures(final RefMetaDataTracker tracker) { - return tracker.getValuesAsGATKFeatures(variableName); - } - public Tags getTags() { return tags; } diff --git a/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java b/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java index c47accb00..e51871498 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java +++ b/public/java/src/org/broadinstitute/sting/gatk/refdata/RefMetaDataTracker.java @@ -1,6 +1,8 @@ package org.broadinstitute.sting.gatk.refdata; import org.apache.log4j.Logger; +import org.broad.tribble.Feature; +import org.broadinstitute.sting.commandline.RodBinding; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; import org.broadinstitute.sting.gatk.refdata.utils.RODRecordList; @@ -91,45 +93,81 @@ public class RefMetaDataTracker { // // ------------------------------------------------------------------------------------------ - public List getValues(Class type) { + public List getValues(Class type) { return addValues(map.keySet(), type, new ArrayList(), null, false, false); } - public List getValues(Class type, final GenomeLoc onlyAtThisLoc) { + public List getValues(Class type, final GenomeLoc onlyAtThisLoc) { return addValues(map.keySet(), type, new ArrayList(), onlyAtThisLoc, true, false); } - public List getValues(Class type, final String name) { + public List getValues(Class type, final String name) { return addValues(name, type, new ArrayList(), getTrackDataByName(name), null, false, false); } - public List getValues(Class type, final String name, final GenomeLoc onlyAtThisLoc) { + public List getValues(Class type, final String name, final GenomeLoc onlyAtThisLoc) { return addValues(name, type, new ArrayList(), getTrackDataByName(name), onlyAtThisLoc, true, false); } - public List getValues(Class type, final Collection names) { + public List getValues(Class type, final Collection names) { return addValues(names, type, new ArrayList(), null, false, false); } - public List getValues(Class type, final Collection names, final GenomeLoc onlyAtThisLoc) { + public List getValues(Class type, final Collection names, final GenomeLoc onlyAtThisLoc) { return addValues(names, type, new ArrayList(), onlyAtThisLoc, true, false); } - public T getFirstValue(Class type) { + public T getFirstValue(Class type) { return safeGetFirst(getValues(type)); } - public T getFirstValue(Class type, final GenomeLoc onlyAtThisLoc) { + public T getFirstValue(Class type, final GenomeLoc onlyAtThisLoc) { return safeGetFirst(getValues(type, onlyAtThisLoc)); } - public T getFirstValue(Class type, final String name) { + public T getFirstValue(Class type, final String name) { return safeGetFirst(getValues(type, name)); } - public T getFirstValue(Class type, final String name, final GenomeLoc onlyAtThisLoc) { + public T getFirstValue(Class type, final String name, final GenomeLoc onlyAtThisLoc) { return safeGetFirst(getValues(type, name, onlyAtThisLoc)); } - public T getFirstValue(Class type, final Collection names) { + public T getFirstValue(Class type, final Collection names) { return safeGetFirst(getValues(type, names)); } - public T getFirstValue(Class type, final Collection names, final GenomeLoc onlyAtThisLoc) { + public T getFirstValue(Class type, final Collection names, final GenomeLoc onlyAtThisLoc) { return safeGetFirst(getValues(type, names, onlyAtThisLoc)); } - final private T safeGetFirst(List l) { + // + // ROD binding accessors + // + public List getValues(RodBinding rodBinding) { + return getValues(rodBinding.getType(), rodBinding.getVariableName()); + } + public List getValues(RodBinding rodBinding, final GenomeLoc onlyAtThisLoc) { + return getValues(rodBinding.getType(), rodBinding.getVariableName(), onlyAtThisLoc); + } + + public T getFirstValue(RodBinding rodBinding) { + return getFirstValue(rodBinding.getType(), rodBinding.getVariableName()); + } + public T getFirstValue(RodBinding rodBinding, final GenomeLoc onlyAtThisLoc) { + return getFirstValue(rodBinding.getType(), rodBinding.getVariableName(), onlyAtThisLoc); + } + + public boolean hasValues(RodBinding rodBinding) { + return hasValues(rodBinding.getVariableName()); + } + + public List getValuesAsGATKFeatures(RodBinding rodBinding) { + return getValuesAsGATKFeatures(rodBinding.getVariableName()); + } + + /** + * Helper function for getFirst() operations that takes a list of and + * returns the first element, or null if no such element exists. + * + * TODO: determine specific behavior for l.size() > 1. Do we turn first or an error? + * TODO: right now we return the first. Should be clearer + * + * @param l + * @param + * @return + */ + final private T safeGetFirst(List l) { // todo: should we be warning people here? Throwing an error? return l.isEmpty() ? null : l.get(0); } @@ -216,7 +254,7 @@ public class RefMetaDataTracker { */ @Deprecated public List getValues(final String name) { - return getValues(name, Object.class); + return (List)(List)getValues(name, Feature.class); } /** @@ -229,7 +267,7 @@ public class RefMetaDataTracker { * Important: The list returned by this function is guaranteed not to be null, but may be empty! */ @Deprecated - public List getValues(final String name, final Class clazz) { + public List getValues(final String name, final Class clazz) { RODRecordList list = getTrackDataByName(name); if (list.isEmpty()) @@ -250,11 +288,11 @@ public class RefMetaDataTracker { * * @param name the name of the track * @param clazz the underlying type to return - * @param the type to parameterize on, matching the clazz argument + * @param the type to parameterize on, matching the clazz argument * @return a record of type T, or null if no record is present. */ @Deprecated - public T getFirstValue(final String name, final Class clazz) { + public T getFirstValue(final String name, final Class clazz) { RODRecordList objects = getTrackDataByName(name); if (objects.isEmpty()) return null; @@ -411,7 +449,7 @@ public class RefMetaDataTracker { addValues("xxx", VariantContext.class, contexts, rodList, curLocation, requireStartHere, takeFirstOnly); } - private List addValues(final Collection names, + private List addValues(final Collection names, final Class type, final List values, final GenomeLoc curLocation, @@ -425,7 +463,7 @@ public class RefMetaDataTracker { return values; } - private List addValues(final String name, + private List addValues(final String name, final Class type, final List values, final RODRecordList rodList, diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableNewRodStyle.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableNewRodStyle.java index 575daa19d..b8c6fd530 100644 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableNewRodStyle.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/variantutils/VariantsToTableNewRodStyle.java @@ -139,7 +139,7 @@ public class VariantsToTableNewRodStyle extends RodWalker { System.out.printf("VariantList binding %s tags=%s%n", binding, binding.getTags().getPositionalTags()); if ( ++nRecords < MAX_RECORDS || MAX_RECORDS == -1 ) { - VariantContext vc = variants.getFirstValue(tracker, context.getLocation()); + VariantContext vc = tracker.getFirstValue(variants, context.getLocation()); if ( (keepMultiAllelic || vc.isBiallelic()) && ( showFiltered || vc.isNotFiltered() ) ) { List vals = extractFields(vc, fieldsToTake, ALLOW_MISSING_DATA); out.println(Utils.join("\t", vals)); diff --git a/public/java/test/org/broadinstitute/sting/gatk/refdata/RefMetaDataTrackerUnitTest.java b/public/java/test/org/broadinstitute/sting/gatk/refdata/RefMetaDataTrackerUnitTest.java index 7ae1ed3be..28da4a8f0 100644 --- a/public/java/test/org/broadinstitute/sting/gatk/refdata/RefMetaDataTrackerUnitTest.java +++ b/public/java/test/org/broadinstitute/sting/gatk/refdata/RefMetaDataTrackerUnitTest.java @@ -30,6 +30,8 @@ import org.broad.tribble.Feature; import org.broad.tribble.dbsnp.DbSNPCodec; import org.broad.tribble.dbsnp.DbSNPFeature; import org.broadinstitute.sting.BaseTest; +import org.broadinstitute.sting.commandline.RodBinding; +import org.broadinstitute.sting.commandline.Tags; import org.broadinstitute.sting.gatk.contexts.ReferenceContext; import org.broadinstitute.sting.gatk.refdata.features.table.TableFeature; import org.broadinstitute.sting.gatk.refdata.utils.GATKFeature; @@ -181,7 +183,7 @@ public class RefMetaDataTrackerUnitTest { testSimpleBindings("B", tracker, test.BValues); } - private void testSimpleBindings(String name, RefMetaDataTracker tracker, RODRecordList expected) { + private void testSimpleBindings(String name, RefMetaDataTracker tracker, RODRecordList expected) { List asValues = tracker.getValues(Feature.class, name); List asFeatures = tracker.getValuesAsGATKFeatures(name); @@ -207,8 +209,8 @@ public class RefMetaDataTrackerUnitTest { } @Test(enabled = true, dataProvider = "tests") - public void testGetters(MyTest test) { - logger.warn("Testing " + test + " for getFirst() methods"); + public void testGettersAsString(MyTest test) { + logger.warn("Testing " + test + " for get() methods"); RefMetaDataTracker tracker = test.makeTracker(); for ( String name : Arrays.asList("A+B", "A", "B") ) { @@ -226,6 +228,27 @@ public class RefMetaDataTrackerUnitTest { } } + @Test(enabled = true, dataProvider = "tests") + public void testGettersAsRodBindings(MyTest test) { + logger.warn("Testing " + test + " for get() methods as RodBindings"); + RefMetaDataTracker tracker = test.makeTracker(); + + for ( String nameAsString : Arrays.asList("A", "B") ) { + RodBinding binding = new RodBinding(Feature.class, nameAsString, "none", new Tags()); + List v1 = tracker.getValues(binding); + testGetter(nameAsString, v1, test.expected(nameAsString), true, tracker); + + List v2 = tracker.getValues(binding, locus); + testGetter(nameAsString, v2, startingHere(test.expected(nameAsString)), true, tracker); + + Feature v3 = tracker.getFirstValue(binding); + testGetter(nameAsString, Arrays.asList(v3), test.expected(nameAsString), false, tracker); + + Feature v4 = tracker.getFirstValue(binding, locus); + testGetter(nameAsString, Arrays.asList(v4), startingHere(test.expected(nameAsString)), false, tracker); + } + } + private List startingHere(List l) { List x = new ArrayList(); for ( GATKFeature f : l ) if ( f.getStart() == locus.getStart() ) x.add(f);