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 CigarElement nextElement = state.peekForwardOnGenome(); // next cigar element
|
||||||
final CigarOperator nextOp = nextElement.getOperator();
|
final CigarOperator nextOp = nextElement.getOperator();
|
||||||
final int readOffset = state.getReadOffset(); // the base offset on this read
|
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();
|
int nextElementLength = nextElement.getLength();
|
||||||
|
|
||||||
if (op == CigarOperator.N) // N's are never added to any pileup
|
if (op == CigarOperator.N) // N's are never added to any pileup
|
||||||
|
|
@ -483,8 +483,12 @@ public class LocusIteratorByState extends LocusIterator {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!filterBaseInRead(read, location.getStart())) {
|
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()),
|
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++;
|
size++;
|
||||||
if (read.getMappingQuality() == 0)
|
if (read.getMappingQuality() == 0)
|
||||||
nMQ0Reads++;
|
nMQ0Reads++;
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import net.sf.samtools.SAMRecord;
|
||||||
import net.sf.samtools.util.CloseableIterator;
|
import net.sf.samtools.util.CloseableIterator;
|
||||||
import org.broadinstitute.sting.gatk.filters.ReadFilter;
|
import org.broadinstitute.sting.gatk.filters.ReadFilter;
|
||||||
import org.broadinstitute.sting.utils.Utils;
|
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.pileup.ReadBackedPileup;
|
||||||
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
|
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
|
||||||
import org.testng.Assert;
|
import org.testng.Assert;
|
||||||
|
|
@ -85,6 +86,55 @@ public class LocusIteratorByStateUnitTest extends BaseTest {
|
||||||
|
|
||||||
Assert.assertTrue(foundExtendedEventPileup,"Extended event pileup not found");
|
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
|
* Right now, the GATK's extended event pileup DOES NOT include reads which stop immediately before an insertion
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue