From 7b07c4e04e2b089836524bc8522fe425c05502f2 Mon Sep 17 00:00:00 2001 From: Mark DePristo Date: Sat, 30 Jul 2011 15:34:11 -0400 Subject: [PATCH] RefMetaDataTracker now has get() methods accepting RodBindings RodBinding no longer duplicates the get() methods in RMDT. This is just an object now that connects the command line system to the RMDT. Updated programs to use new style Added UnitTests for the RodBinding accessors. --- .../sting/commandline/RodBinding.java | 34 +-------- .../gatk/refdata/RefMetaDataTracker.java | 76 ++++++++++++++----- .../VariantsToTableNewRodStyle.java | 2 +- .../refdata/RefMetaDataTrackerUnitTest.java | 29 ++++++- 4 files changed, 87 insertions(+), 54 deletions(-) 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);