WTF - why is support for whole-read insertions all messed up in LIBS? I've pushed a temporary patch for now (the right solution should certainly not be implemented in stable; LIBS needs to be better thought out). Added another unit test.

This commit is contained in:
Eric Banks 2012-08-22 00:24:01 -04:00
parent 40d5efc804
commit 03017855e4
2 changed files with 31 additions and 9 deletions

View File

@ -304,7 +304,7 @@ public class LocusIteratorByState extends LocusIterator {
final boolean isSingleElementCigar = nextElement == lastElement; final boolean isSingleElementCigar = nextElement == lastElement;
final CigarOperator nextOp = nextElement.getOperator(); // next cigar operator final CigarOperator nextOp = nextElement.getOperator(); // next cigar operator
final CigarOperator lastOp = lastElement.getOperator(); // last cigar operator final CigarOperator lastOp = lastElement.getOperator(); // last cigar operator
final int readOffset = state.getReadOffset(); // the base offset on this read int readOffset = state.getReadOffset(); // the base offset on this read
final boolean isBeforeDeletion = nextOp == CigarOperator.DELETION; final boolean isBeforeDeletion = nextOp == CigarOperator.DELETION;
final boolean isAfterDeletion = lastOp == CigarOperator.DELETION; final boolean isAfterDeletion = lastOp == CigarOperator.DELETION;
@ -331,6 +331,9 @@ public class LocusIteratorByState extends LocusIterator {
String insertedBaseString = null; String insertedBaseString = null;
if (nextOp == CigarOperator.I) { if (nextOp == CigarOperator.I) {
final int insertionOffset = isSingleElementCigar ? 0 : 1; final int insertionOffset = isSingleElementCigar ? 0 : 1;
// TODO -- someone please implement a better fix for the single element insertion CIGAR!
if (isSingleElementCigar)
readOffset -= (nextElement.getLength() - 1); // LIBS has passed over the insertion bases!
insertedBaseString = new String(Arrays.copyOfRange(read.getReadBases(), readOffset + insertionOffset, readOffset + insertionOffset + nextElement.getLength())); insertedBaseString = new String(Arrays.copyOfRange(read.getReadBases(), readOffset + insertionOffset, readOffset + insertionOffset + nextElement.getLength()));
} }

View File

@ -208,19 +208,18 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
} }
/** /**
* Test to make sure that reads supporting only an indel (example cigar string: 76I) do * Test to make sure that reads supporting only an indel (example cigar string: 76I) are represented properly
* not negatively influence the ordering of the pileup.
*/ */
@Test @Test
public void testWholeIndelReadTest2() { public void testWholeIndelReadRepresentedTest() {
final int firstLocus = 44367788, secondLocus = firstLocus + 1; final int firstLocus = 44367788, secondLocus = firstLocus + 1;
SAMRecord read = ArtificialSAMUtils.createArtificialRead(header,"read",0,secondLocus,1); SAMRecord read1 = ArtificialSAMUtils.createArtificialRead(header,"read1",0,secondLocus,1);
read.setReadBases(Utils.dupBytes((byte) 'A', 1)); read1.setReadBases(Utils.dupBytes((byte) 'A', 1));
read.setBaseQualities(Utils.dupBytes((byte) '@', 1)); read1.setBaseQualities(Utils.dupBytes((byte) '@', 1));
read.setCigarString("1I"); read1.setCigarString("1I");
List<SAMRecord> reads = Arrays.asList(read); List<SAMRecord> reads = Arrays.asList(read1);
// create the iterator by state with the fake reads and fake records // create the iterator by state with the fake reads and fake records
li = makeLTBS(reads, createTestReadProperties()); li = makeLTBS(reads, createTestReadProperties());
@ -234,6 +233,26 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
Assert.assertFalse(pe.isAfterInsertion()); Assert.assertFalse(pe.isAfterInsertion());
Assert.assertEquals(pe.getEventBases(), "A"); Assert.assertEquals(pe.getEventBases(), "A");
} }
SAMRecord read2 = ArtificialSAMUtils.createArtificialRead(header,"read2",0,secondLocus,10);
read2.setReadBases(Utils.dupBytes((byte) 'A', 10));
read2.setBaseQualities(Utils.dupBytes((byte) '@', 10));
read2.setCigarString("10I");
reads = Arrays.asList(read2);
// create the iterator by state with the fake reads and fake records
li = makeLTBS(reads, createTestReadProperties());
while(li.hasNext()) {
AlignmentContext alignmentContext = li.next();
ReadBackedPileup p = alignmentContext.getBasePileup();
Assert.assertTrue(p.getNumberOfElements() == 1);
PileupElement pe = p.iterator().next();
Assert.assertTrue(pe.isBeforeInsertion());
Assert.assertFalse(pe.isAfterInsertion());
Assert.assertEquals(pe.getEventBases(), "AAAAAAAAAA");
}
} }
private static ReadProperties createTestReadProperties() { private static ReadProperties createTestReadProperties() {