diff --git a/java/src/org/broadinstitute/sting/utils/Utils.java b/java/src/org/broadinstitute/sting/utils/Utils.java index 5a667df67..39ea6f16b 100755 --- a/java/src/org/broadinstitute/sting/utils/Utils.java +++ b/java/src/org/broadinstitute/sting/utils/Utils.java @@ -169,6 +169,76 @@ public class Utils { return quals.toString(); } + public static ArrayList secondaryBasePileup( List reads, List offsets ) { + ArrayList bases2 = new ArrayList(reads.size()); + boolean hasAtLeastOneSQField = false; + + for ( int i = 0; i < reads.size(); i++ ) { + SAMRecord read = reads.get(i); + int offset = offsets.get(i); + + byte[] compressedQuals = (byte[]) read.getAttribute("SQ"); + byte base2; + //byte qual2; + if (compressedQuals != null) { + base2 = (byte) BaseUtils.baseIndexToSimpleBase(QualityUtils.compressedQualityToBaseIndex(compressedQuals[offset])); + //qual2 = QualityUtils.probToQual(QualityUtils.compressedQualityToProb(compressedQuals[offset])); + hasAtLeastOneSQField = true; + } else { + base2 = (byte) '.'; + } + bases2.add(base2); + } + return (hasAtLeastOneSQField ? bases2 : null); + } + + public static String secondaryBasePileupAsString( List reads, List offsets ) { + StringBuilder bases2 = new StringBuilder(); + ArrayList sqbases = secondaryBasePileup(reads, offsets); + + if (sqbases == null) { return null; } + + for (byte base2 : secondaryBasePileup(reads, offsets)) { + bases2.append((char) base2); + } + + return bases2.toString(); + } + + public static ArrayList secondaryQualPileup( List reads, List offsets ) { + ArrayList quals2 = new ArrayList(reads.size()); + boolean hasAtLeastOneSQField = false; + + for ( int i = 0; i < reads.size(); i++ ) { + SAMRecord read = reads.get(i); + int offset = offsets.get(i); + + byte[] compressedQuals = (byte[]) read.getAttribute("SQ"); + byte qual2; + if (compressedQuals != null) { + qual2 = QualityUtils.probToQual(QualityUtils.compressedQualityToProb(compressedQuals[offset])); + hasAtLeastOneSQField = true; + } else { + qual2 = 0; + } + quals2.add(qual2); + } + return (hasAtLeastOneSQField ? quals2 : null); + } + + 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); + } + + return quals2.toString(); + } + public static ArrayList subseq(byte[] fullArray) { return subseq(fullArray, 0, fullArray.length); }