a) Bug fix in calling new functions that give indel bases and length from regular pileup in LocusIteratorByState, b) Added unit test to cover these.
This commit is contained in:
parent
c9a4c74f7a
commit
dea35943d1
|
|
@ -465,7 +465,7 @@ public class LocusIteratorByState extends LocusIterator {
|
|||
final CigarElement nextElement = state.peekForwardOnGenome(); // next cigar element
|
||||
final CigarOperator nextOp = nextElement.getOperator();
|
||||
final int readOffset = state.getReadOffset(); // the base offset on this read
|
||||
byte[] insertedBases = Arrays.copyOfRange(read.getReadBases(), readOffset + 1, readOffset + 1 + nextElement.getLength());
|
||||
|
||||
int nextElementLength = nextElement.getLength();
|
||||
|
||||
if (op == CigarOperator.N) // N's are never added to any pileup
|
||||
|
|
@ -483,8 +483,12 @@ public class LocusIteratorByState extends LocusIterator {
|
|||
}
|
||||
else {
|
||||
if (!filterBaseInRead(read, location.getStart())) {
|
||||
String insertedBaseString = null;
|
||||
if (nextOp == CigarOperator.I) {
|
||||
insertedBaseString = new String(Arrays.copyOfRange(read.getReadBases(), readOffset + 1, readOffset + 1 + nextElement.getLength()));
|
||||
}
|
||||
pile.add(new PileupElement(read, readOffset, false, nextOp == CigarOperator.D, nextOp == CigarOperator.I, nextOp == CigarOperator.S || (state.getGenomeOffset() == 0 && read.getSoftStart() != read.getAlignmentStart()),
|
||||
new String(insertedBases),nextElementLength));
|
||||
insertedBaseString,nextElementLength));
|
||||
size++;
|
||||
if (read.getMappingQuality() == 0)
|
||||
nMQ0Reads++;
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import net.sf.samtools.SAMRecord;
|
|||
import net.sf.samtools.util.CloseableIterator;
|
||||
import org.broadinstitute.sting.gatk.filters.ReadFilter;
|
||||
import org.broadinstitute.sting.utils.Utils;
|
||||
import org.broadinstitute.sting.utils.pileup.PileupElement;
|
||||
import org.broadinstitute.sting.utils.pileup.ReadBackedPileup;
|
||||
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
|
||||
import org.testng.Assert;
|
||||
|
|
@ -85,6 +86,55 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
|
|||
|
||||
Assert.assertTrue(foundExtendedEventPileup,"Extended event pileup not found");
|
||||
}
|
||||
@Test
|
||||
public void testIndelsInRegularPileup() {
|
||||
final byte[] bases = new byte[] {'A','A','A','A','A','A','A','A','A','A'};
|
||||
final byte[] indelBases = new byte[] {'A','A','A','A','C','T','A','A','A','A','A','A'};
|
||||
|
||||
// create a test version of the Reads object
|
||||
ReadProperties readAttributes = createTestReadProperties();
|
||||
JVMUtils.setFieldValue(JVMUtils.findField(ReadProperties.class,"generateExtendedEvents"),readAttributes,true);
|
||||
|
||||
SAMRecord before = ArtificialSAMUtils.createArtificialRead(header,"before",0,1,10);
|
||||
before.setReadBases(bases);
|
||||
before.setBaseQualities(new byte[] {20,20,20,20,20,20,20,20,20,20});
|
||||
before.setCigarString("10M");
|
||||
|
||||
SAMRecord during = ArtificialSAMUtils.createArtificialRead(header,"during",0,2,10);
|
||||
during.setReadBases(indelBases);
|
||||
during.setBaseQualities(new byte[] {20,20,20,20,20,20,20,20,20,20,20,20});
|
||||
during.setCigarString("4M2I6M");
|
||||
|
||||
SAMRecord after = ArtificialSAMUtils.createArtificialRead(header,"after",0,3,10);
|
||||
after.setReadBases(bases);
|
||||
after.setBaseQualities(new byte[] {20,20,20,20,20,20,20,20,20,20});
|
||||
after.setCigarString("10M");
|
||||
|
||||
List<SAMRecord> reads = Arrays.asList(before,during,after);
|
||||
|
||||
// create the iterator by state with the fake reads and fake records
|
||||
li = makeLTBS(reads,readAttributes);
|
||||
|
||||
boolean foundIndel = false;
|
||||
while (li.hasNext()) {
|
||||
AlignmentContext context = li.next();
|
||||
if(!context.hasBasePileup())
|
||||
continue;
|
||||
|
||||
ReadBackedPileup pileup = context.getBasePileup().getBaseFilteredPileup(10);
|
||||
for (PileupElement p : pileup) {
|
||||
if (p.isBeforeInsertion()) {
|
||||
foundIndel = true;
|
||||
Assert.assertEquals(p.getEventLength(), 2, "Wrong event length");
|
||||
Assert.assertEquals(p.getEventBases(), "CT", "Inserted bases are incorrect");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Assert.assertTrue(foundIndel,"Indel in pileup not found");
|
||||
}
|
||||
|
||||
/**
|
||||
* Right now, the GATK's extended event pileup DOES NOT include reads which stop immediately before an insertion
|
||||
|
|
|
|||
Loading…
Reference in New Issue