Fixing ReadBackedPileup to represent mapping qualities as ints, not (signed) bytes.

Having them as bytes caused problems for downstream programmers who had data with high MQs.
This commit is contained in:
Eric Banks 2013-07-23 23:47:15 -04:00
parent 71222bff45
commit 6df43f730a
4 changed files with 26 additions and 7 deletions

View File

@ -156,7 +156,7 @@ public final class QualifyMissingIntervals extends LocusWalker<Metrics, Metrics>
baseQual += qual;
}
double mapQual = 0.0;
for (byte qual : pileup.getMappingQuals()) {
for (int qual : pileup.getMappingQuals()) {
mapQual += qual;
}

View File

@ -270,7 +270,7 @@ public interface ReadBackedPileup extends Iterable<PileupElement>, HasGenomeLoca
* Get an array of the mapping qualities
* @return
*/
public byte[] getMappingQuals();
public int[] getMappingQuals();
/**
* Returns a new ReadBackedPileup that is sorted by start coordinate of the reads.

View File

@ -969,11 +969,11 @@ public class ReadBackedPileupImpl implements ReadBackedPileup {
* @return
*/
@Override
public byte[] getMappingQuals() {
byte[] v = new byte[getNumberOfElements()];
public int[] getMappingQuals() {
final int[] v = new int[getNumberOfElements()];
int pos = 0;
for (PileupElement pile : pileupElementTracker) {
v[pos++] = (byte) pile.getRead().getMappingQuality();
for ( final PileupElement pile : pileupElementTracker ) {
v[pos++] = pile.getRead().getMappingQuality();
}
return v;
}

View File

@ -296,7 +296,6 @@ public class ReadBackedPileupUnitTest {
testRBPCounts(pileup, new RBPCountTest(params.nReads + 2, params.nMapq0 + 1, params.nDeletions + 1));
}
private void testRBPCounts(final ReadBackedPileup rbp, RBPCountTest expected) {
for ( int cycles = 0; cycles < 3; cycles++ ) {
// multiple cycles to make sure caching is working
@ -306,4 +305,24 @@ public class ReadBackedPileupUnitTest {
Assert.assertEquals(rbp.getNumberOfMappingQualityZeroReads(), expected.nMapq0);
}
}
@Test
public void testRBPMappingQuals() {
// create a read with high MQ
final GATKSAMRecord read = ArtificialSAMUtils.createArtificialRead(header, "read", 0, 1, 10);
read.setReadBases(Utils.dupBytes((byte) 'A', 10));
read.setBaseQualities(Utils.dupBytes((byte) 30, 10));
read.setCigarString("10M");
read.setMappingQuality(200); // set a MQ higher than max signed byte
// now create the RBP
final List<PileupElement> elts = new LinkedList<>();
elts.add(new PileupElement(read, 0, read.getCigar().getCigarElement(0), 0, 0));
final Map<String, ReadBackedPileupImpl> pileupsBySample = new HashMap<>();
pileupsBySample.put("foo", new ReadBackedPileupImpl(loc, elts));
final ReadBackedPileup pileup = new ReadBackedPileupImpl(loc, pileupsBySample);
Assert.assertEquals(pileup.getMappingQuals()[0], 200);
}
}