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:
parent
40d5efc804
commit
03017855e4
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue