diff --git a/java/src/org/broadinstitute/sting/gatk/contexts/variantcontext/Allele.java b/java/src/org/broadinstitute/sting/gatk/contexts/variantcontext/Allele.java index 9dee3fece..d4712bd72 100755 --- a/java/src/org/broadinstitute/sting/gatk/contexts/variantcontext/Allele.java +++ b/java/src/org/broadinstitute/sting/gatk/contexts/variantcontext/Allele.java @@ -121,23 +121,33 @@ public class Allele implements Comparable { } /** - * Do the bases represent the null allele? + * @param bases bases representing an allele + * @return true if the bases represent the null allele */ public static boolean wouldBeNullAllele(byte[] bases) { return (bases.length == 1 && bases[0] == '-') || bases.length == 0; } - /** Do the bases represent the NO_CALL allele? */ + /** + * @param bases bases representing an allele + * @return true if the bases represent the NO_CALL allele + */ public static boolean wouldBeNoCallAllele(byte[] bases) { return bases.length == 1 && bases[0] == '.'; } - /** Do the bases represent the null allele? */ + /** + * @param bases bases representing an allele + * @return true if the bases represent the well formatted allele + */ public static boolean acceptableAlleleBases(String bases) { return acceptableAlleleBases(bases.getBytes()); } - /** Can we create an allele from bases, including NO_CALL and Null alleles? */ + /** + * @param bases bases representing an allele + * @return true if the bases represent the well formatted allele + */ public static boolean acceptableAlleleBases(byte[] bases) { if ( wouldBeNullAllele(bases) || wouldBeNoCallAllele(bases) ) return true; @@ -154,8 +164,8 @@ public class Allele implements Comparable { /** * @see Allele(byte[], boolean) * - * @param bases - * @param isRef + * @param bases bases representing an allele + * @param isRef is this the reference allele? */ public Allele(String bases, boolean isRef) { this(bases.getBytes(), isRef); @@ -164,14 +174,14 @@ public class Allele implements Comparable { /** * Creates a non-Ref allele. @see Allele(byte[], boolean) for full information * - * @param bases + * @param bases bases representing an allele */ public Allele(String bases) { this(bases, false); } /** * Creates a non-Ref allele. @see Allele(byte[], boolean) for full information * - * @param bases + * @param bases bases representing an allele */ public Allele(byte[] bases) { this(bases, false); } @@ -181,22 +191,22 @@ public class Allele implements Comparable { // // --------------------------------------------------------------------------------------------------------- - /** Returns true if this is the null allele */ + //Returns true if this is the null allele public boolean isNull() { return isNull; } - /** Returns true if this is not the null allele */ + // Returns true if this is not the null allele public boolean isNonNull() { return ! isNull(); } - /** Returns true if this is the NO_CALL allele */ + // Returns true if this is the NO_CALL allele public boolean isNoCall() { return isNoCall; } - /** Returns true if this is the not the NO_CALL allele */ + // Returns true if this is the not the NO_CALL allele public boolean isCalled() { return ! isNoCall(); } - /** Returns true if this Allele is the reference allele */ + // Returns true if this Allele is the reference allele public boolean isReference() { return isRef; } - /** Returns true if this Allele is not the reference allele */ + // Returns true if this Allele is not the reference allele public boolean isNonReference() { return ! isReference(); } - /** Returns a nice string representation of this object */ + // Returns a nice string representation of this object public String toString() { return (isNull() ? "-" : ( isNoCall() ? "." : new String(getBases()))) + (isReference() ? "*" : ""); } @@ -214,52 +224,55 @@ public class Allele implements Comparable { * * @return true if these alleles are equal */ - public boolean equals(Allele other) { - return equals(other, false); + public boolean equals(Object other) { + return ( ! (other instanceof Allele) ? false : equals((Allele)other, false) ); + } + + /** + * @return hash code + */ + public int hashCode() { + int hash = 1; + for (int i = 0; i < bases.length; i++) + hash += (i+1) * bases[i]; + return hash; } /** * Returns true if this and other are equal. If ignoreRefState is true, then doesn't require both alleles has the * same ref tag * - * @param other - * @param ignoreRefState - * @return + * @param other allele to compare to + * @param ignoreRefState if true, ignore ref state in comparison + * @return true if this and other are equal */ public boolean equals(Allele other, boolean ignoreRefState) { - return (isRef == other.isRef || ignoreRefState) && isNull == other.isNull && isNoCall == other.isNoCall && this.basesMatch(other.getBases()); + return (isRef == other.isRef || ignoreRefState) && isNull == other.isNull && isNoCall == other.isNoCall && basesMatch(other.getBases()); } /** - * Returns true if this Alelle contains the same bases as test, regardless of its reference status. Also handles - * Null and NO_CALL alleles + * @param test bases to test against * - * @param test - * @return + * @return true if this Alelle contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles */ public boolean basesMatch(byte[] test) { return bases == test || Arrays.equals(bases, test); } /** - * Returns true if this Alelle contains the same bases as test, regardless of its reference status. Also handles - * Null and NO_CALL alleles + * @param test bases to test against * - * @param test - * @return + * @return true if this Alelle contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles */ public boolean basesMatch(String test) { return basesMatch(test.toUpperCase().getBytes()); } /** - * Returns true if this Alelle contains the same bases as test, regardless of its reference status. Also handles - * Null and NO_CALL alleles + * @param test allele to test against * - * @param test - * @return + * @return true if this Alelle contains the same bases as test, regardless of its reference status; handles Null and NO_CALL alleles */ public boolean basesMatch(Allele test) { return basesMatch(test.getBases()); } /** - * Returns the length of this allele. Null and NO_CALL alleles have 0 length. - * @return + * @return the length of this allele. Null and NO_CALL alleles have 0 length. */ public int length() { return bases.length; diff --git a/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java b/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java index 2879cd847..767210974 100755 --- a/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java +++ b/java/src/org/broadinstitute/sting/gatk/refdata/VariantContextAdaptors.java @@ -227,9 +227,8 @@ public class VariantContextAdaptors { String filters = vc.isFiltered() ? Utils.join(";", Utils.sorted(vc.getFilters())) : (filtersWereAppliedToContext ? VCFRecord.PASSES_FILTERS : VCFRecord.UNFILTERED); - // TODO - fixme: temporarily using Strings as keys because Alleles aren't hashing correctly - Map alleleMap = new HashMap(); - alleleMap.put(Allele.NO_CALL.toString(), new VCFGenotypeEncoding(VCFGenotypeRecord.EMPTY_ALLELE)); // convenience for lookup + Map alleleMap = new HashMap(); + alleleMap.put(Allele.NO_CALL, new VCFGenotypeEncoding(VCFGenotypeRecord.EMPTY_ALLELE)); // convenience for lookup List vcfAltAlleles = new ArrayList(); for ( Allele a : vc.getAlleles() ) { @@ -271,7 +270,7 @@ public class VariantContextAdaptors { vcfAltAlleles.add(encoding); } - alleleMap.put(a.toString(), encoding); + alleleMap.put(a, encoding); } if ( vcfGenotypeAttributeKeys == null ) { @@ -288,7 +287,7 @@ public class VariantContextAdaptors { List encodings = new ArrayList(g.getPloidy()); for ( Allele a : g.getAlleles() ) { - encodings.add(alleleMap.get(a.toString())); + encodings.add(alleleMap.get(a)); } VCFGenotypeRecord.PHASE phasing = g.genotypesArePhased() ? VCFGenotypeRecord.PHASE.PHASED : VCFGenotypeRecord.PHASE.UNPHASED;