Better exceptions to catch malformed reads
* throw exceptions in LocusIteratorByState when hitting reads starting or ending with deletions
This commit is contained in:
parent
810996cfca
commit
45da892ecc
|
|
@ -193,6 +193,9 @@ public class LocusIteratorByState extends LocusIterator {
|
||||||
// we reenter in order to re-check cigarElementCounter against curElement's length
|
// we reenter in order to re-check cigarElementCounter against curElement's length
|
||||||
return stepForwardOnGenome();
|
return stepForwardOnGenome();
|
||||||
} else {
|
} else {
|
||||||
|
if (curElement != null && curElement.getOperator() == CigarOperator.D)
|
||||||
|
throw new UserException.MalformedBAM(read, "read ends with deletion. Cigar: " + read.getCigarString());
|
||||||
|
|
||||||
// Reads that contain indels model the genomeOffset as the following base in the reference. Because
|
// Reads that contain indels model the genomeOffset as the following base in the reference. Because
|
||||||
// we fall into this else block only when indels end the read, increment genomeOffset such that the
|
// we fall into this else block only when indels end the read, increment genomeOffset such that the
|
||||||
// current offset of this read is the next ref base after the end of the indel. This position will
|
// current offset of this read is the next ref base after the end of the indel. This position will
|
||||||
|
|
@ -228,7 +231,7 @@ public class LocusIteratorByState extends LocusIterator {
|
||||||
// we see insertions only once, when we step right onto them; the position on the read is scrolled
|
// we see insertions only once, when we step right onto them; the position on the read is scrolled
|
||||||
// past the insertion right after that
|
// past the insertion right after that
|
||||||
if (eventDelayedFlag > 1)
|
if (eventDelayedFlag > 1)
|
||||||
throw new UserException.MalformedBAM(read, "Adjacent I/D events in read " + read.getReadName());
|
throw new UserException.MalformedBAM(read, String.format("Adjacent I/D events in read %s -- cigar: %s", read.getReadName(), read.getCigarString()));
|
||||||
insertedBases = Arrays.copyOfRange(read.getReadBases(), readOffset + 1, readOffset + 1 + curElement.getLength());
|
insertedBases = Arrays.copyOfRange(read.getReadBases(), readOffset + 1, readOffset + 1 + curElement.getLength());
|
||||||
eventLength = curElement.getLength();
|
eventLength = curElement.getLength();
|
||||||
eventStart = readOffset;
|
eventStart = readOffset;
|
||||||
|
|
@ -247,7 +250,7 @@ public class LocusIteratorByState extends LocusIterator {
|
||||||
// generate an extended event only if we just stepped into the deletion (i.e. don't
|
// generate an extended event only if we just stepped into the deletion (i.e. don't
|
||||||
// generate the event at every deleted position on the ref, that's what cigarElementCounter==1 is for!)
|
// generate the event at every deleted position on the ref, that's what cigarElementCounter==1 is for!)
|
||||||
if (eventDelayedFlag > 1)
|
if (eventDelayedFlag > 1)
|
||||||
throw new UserException.MalformedBAM(read, "Adjacent I/D events in read " + read.getReadName());
|
throw new UserException.MalformedBAM(read, String.format("Adjacent I/D events in read %s -- cigar: %s", read.getReadName(), read.getCigarString()));
|
||||||
eventLength = curElement.getLength();
|
eventLength = curElement.getLength();
|
||||||
eventDelayedFlag = 2; // deletion on the ref causes an immediate return, so we have to delay by 1 only
|
eventDelayedFlag = 2; // deletion on the ref causes an immediate return, so we have to delay by 1 only
|
||||||
eventStart = readOffset;
|
eventStart = readOffset;
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.google.java.contract.Ensures;
|
||||||
import com.google.java.contract.Requires;
|
import com.google.java.contract.Requires;
|
||||||
import org.broadinstitute.sting.utils.BaseUtils;
|
import org.broadinstitute.sting.utils.BaseUtils;
|
||||||
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
|
import org.broadinstitute.sting.utils.exceptions.ReviewedStingException;
|
||||||
|
import org.broadinstitute.sting.utils.exceptions.UserException;
|
||||||
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
|
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -146,9 +147,12 @@ public class PileupElement implements Comparable<PileupElement> {
|
||||||
public int getRepresentativeCount() {
|
public int getRepresentativeCount() {
|
||||||
int representativeCount = 1;
|
int representativeCount = 1;
|
||||||
|
|
||||||
if (read.isReducedRead() && !isInsertionAtBeginningOfRead())
|
if (read.isReducedRead() && !isInsertionAtBeginningOfRead()) {
|
||||||
representativeCount = (isDeletion()) ? Math.round((read.getReducedCount(offset) + read.getReducedCount(offset + 1)) / 2) : read.getReducedCount(offset);
|
if (isDeletion() && (offset + 1 >= read.getReadLength()) ) // deletion in the end of the read
|
||||||
|
throw new UserException.MalformedBAM(read, String.format("Adjacent I/D events in read %s -- cigar: %s", read.getReadName(), read.getCigarString()));
|
||||||
|
|
||||||
|
representativeCount = (isDeletion()) ? Math.round((read.getReducedCount(offset) + read.getReducedCount(offset + 1)) / 2) : read.getReducedCount(offset);
|
||||||
|
}
|
||||||
return representativeCount;
|
return representativeCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue