diff --git a/java/src/org/broadinstitute/sting/utils/BaseUtils.java b/java/src/org/broadinstitute/sting/utils/BaseUtils.java index 29335b333..376e1d8a1 100644 --- a/java/src/org/broadinstitute/sting/utils/BaseUtils.java +++ b/java/src/org/broadinstitute/sting/utils/BaseUtils.java @@ -8,7 +8,12 @@ package org.broadinstitute.sting.utils; public class BaseUtils { /** Private constructor. No instantiating this class! */ private BaseUtils() {} - + + static public boolean basesAreEqual(byte base1, byte base2) { + return simpleBaseToBaseIndex((char)base1) == simpleBaseToBaseIndex((char)base2); + } + + /** * Converts a simple base to a base index * diff --git a/java/src/org/broadinstitute/sting/utils/BasicPileup.java b/java/src/org/broadinstitute/sting/utils/BasicPileup.java index c8e2a2dea..0d318f127 100755 --- a/java/src/org/broadinstitute/sting/utils/BasicPileup.java +++ b/java/src/org/broadinstitute/sting/utils/BasicPileup.java @@ -68,15 +68,23 @@ abstract public class BasicPileup implements Pileup { return quals; } - public static String qualPileupAsString( List reads, List offsets ) { - StringBuilder quals = new StringBuilder(); - for ( int qual : qualPileup(reads, offsets)) { + public static String mappingQualPileupAsString( List reads) { + return quals2String(mappingQualPileup(reads)); + } + + public static String quals2String( List quals ) { + StringBuilder qualStr = new StringBuilder(); + for ( int qual : quals ) { qual = Math.min(qual, 63); // todo: fixme, this isn't a good idea char qualChar = (char) (33 + qual); // todo: warning, this is illegal for qual > 63 - quals.append(qualChar); + qualStr.append(qualChar); } - return quals.toString(); + return qualStr.toString(); + } + + public static String qualPileupAsString( List reads, List offsets ) { + return quals2String(qualPileup(reads, offsets)); } public static ArrayList secondaryBasePileup( List reads, List offsets ) { @@ -153,17 +161,18 @@ abstract public class BasicPileup implements Pileup { return (hasAtLeastOneSQField ? quals2 : null); } - public static String secondaryQualPileupAsString( List reads, List offsets ) { + public static String secondaryQualPileupAsString( List reads, List offsets) { StringBuilder quals2 = new StringBuilder(); ArrayList sqquals = secondaryQualPileup(reads, offsets); - if (sqquals == null) { return null; } - - for (byte qual2 : secondaryQualPileup(reads, offsets)) { - quals2.append(qual2); + if (sqquals == null) { + return null; + } else { + for (byte qual2 : secondaryQualPileup(reads, offsets)) { + quals2.append(qual2); + } + return quals2.toString(); } - - return quals2.toString(); } public static double[][] probDistPileup( List reads, List offsets ) { diff --git a/java/src/org/broadinstitute/sting/utils/QualityUtils.java b/java/src/org/broadinstitute/sting/utils/QualityUtils.java index dd8203f2c..42d00c8e6 100755 --- a/java/src/org/broadinstitute/sting/utils/QualityUtils.java +++ b/java/src/org/broadinstitute/sting/utils/QualityUtils.java @@ -23,6 +23,10 @@ public class QualityUtils { return 1.0 - qualToErrorProb(qual); } + static public double qualToProb(int qual) { + return 1.0 - Math.pow(10.0, ((double) qual)/-10.0); + } + /** * Convert a quality score to a probability of error. This is the Phred-style * conversion, *not* the Illumina-style conversion (though asymptotically, they're the same). diff --git a/java/src/org/broadinstitute/sting/utils/ReadBackedPileup.java b/java/src/org/broadinstitute/sting/utils/ReadBackedPileup.java index 05cd0c723..047a9244c 100755 --- a/java/src/org/broadinstitute/sting/utils/ReadBackedPileup.java +++ b/java/src/org/broadinstitute/sting/utils/ReadBackedPileup.java @@ -62,6 +62,10 @@ public class ReadBackedPileup extends BasicPileup { return Utils.join(",", mappingQualPileup(reads)); } + public String getMappingQuals() { + return mappingQualPileupAsString(reads); + } + public String getSecondaryBasePileup() { return secondaryBasePileupAsString(reads, offsets); } @@ -76,6 +80,15 @@ public class ReadBackedPileup extends BasicPileup { public String getPileupString() { - return String.format("%s: %s %s %s", getLocation(), getRef(), getBases(), getQuals()); + // In the pileup format, each line represents a genomic position, consisting of chromosome name, + // coordinate, reference base, read bases, read qualities and alignment mapping qualities. + + //return String.format("%s %s %s %s", getLocation(), getRef(), getBases(), getQuals()); + return String.format("%s %s %s %s %s %s", + getLocation().getContig(), getLocation().getStart(), // chromosome name and coordinate + getRef(), // reference base + getBases(), + getQuals(), + getMappingQuals()); } } \ No newline at end of file