Don't exception out when bad aligners emit wonky alignments; instead, just don't clean

git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@4038 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
ebanks 2010-08-16 02:36:04 +00:00
parent a36951f11a
commit 37586d3a43
1 changed files with 22 additions and 13 deletions

View File

@ -526,7 +526,8 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
// start cleaning the appropriate reads // start cleaning the appropriate reads
for ( Pair<Integer, Integer> indexPair : bestConsensus.readIndexes ) { for ( Pair<Integer, Integer> indexPair : bestConsensus.readIndexes ) {
AlignedRead aRead = altReads.get(indexPair.first); AlignedRead aRead = altReads.get(indexPair.first);
updateRead(bestConsensus.cigar, bestConsensus.positionOnReference, indexPair.second, aRead, (int)leftmostIndex); if ( !updateRead(bestConsensus.cigar, bestConsensus.positionOnReference, indexPair.second, aRead, (int)leftmostIndex) )
return;
} }
if ( !alternateReducesEntropy(altReads, reference, leftmostIndex) ) { if ( !alternateReducesEntropy(altReads, reference, leftmostIndex) ) {
if ( statsOutput != null ) { if ( statsOutput != null ) {
@ -844,7 +845,7 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
} }
private void updateRead(final Cigar altCigar, final int altPosOnRef, final int myPosOnAlt, final AlignedRead aRead, final int leftmostIndex) { private boolean updateRead(final Cigar altCigar, final int altPosOnRef, final int myPosOnAlt, final AlignedRead aRead, final int leftmostIndex) {
Cigar readCigar = new Cigar(); Cigar readCigar = new Cigar();
// special case: there is no indel // special case: there is no indel
@ -852,7 +853,7 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
aRead.setAlignmentStart(leftmostIndex + myPosOnAlt); aRead.setAlignmentStart(leftmostIndex + myPosOnAlt);
readCigar.add(new CigarElement(aRead.getReadLength(), CigarOperator.M)); readCigar.add(new CigarElement(aRead.getReadLength(), CigarOperator.M));
aRead.setCigar(readCigar); aRead.setCigar(readCigar);
return; return true;
} }
CigarElement altCE1 = altCigar.getCigarElement(0); CigarElement altCE1 = altCigar.getCigarElement(0);
@ -863,16 +864,22 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
CigarElement indelCE; CigarElement indelCE;
if ( altCE1.getOperator() == CigarOperator.I ) { if ( altCE1.getOperator() == CigarOperator.I ) {
indelCE=altCE1; indelCE=altCE1;
if ( altCE2.getOperator() != CigarOperator.M ) if ( altCE2.getOperator() != CigarOperator.M ) {
throw new StingException("When first element of the alt consensus is I, the second one must be M. Actual: "+altCigar.toString()); logger.warn("When the first element of the alt consensus is I, the second one must be M. Actual: " + altCigar.toString() + ". Skipping this site...");
return false;
}
} }
else { else {
if ( altCE1.getOperator() != CigarOperator.M ) if ( altCE1.getOperator() != CigarOperator.M ) {
throw new StingException("First element of the alt consensus cigar must be M or I. Actual: "+altCigar.toString()); logger.warn("First element of the alt consensus cigar must be M or I. Actual: " + altCigar.toString() + ". Skipping this site...");
if ( altCE2.getOperator() == CigarOperator.I || altCE2.getOperator() == CigarOperator.D ) return false;
}
if ( altCE2.getOperator() == CigarOperator.I || altCE2.getOperator() == CigarOperator.D ) {
indelCE=altCE2; indelCE=altCE2;
else } else {
throw new StingException("When first element of the alt consensus is M, the second one must be I or D. Actual: "+altCigar.toString()); logger.warn("When first element of the alt consensus is M, the second one must be I or D. Actual: " + altCigar.toString() + ". Skipping this site...");
return false;
}
leadingMatchingBlockLength = altCE1.getLength(); leadingMatchingBlockLength = altCE1.getLength();
} }
@ -889,7 +896,7 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
if ( myPosOnAlt + aRead.getReadLength() <= endOfFirstBlock) { if ( myPosOnAlt + aRead.getReadLength() <= endOfFirstBlock) {
readCigar.add(new CigarElement(aRead.getReadLength(), CigarOperator.M)); readCigar.add(new CigarElement(aRead.getReadLength(), CigarOperator.M));
aRead.setCigar(readCigar); aRead.setCigar(readCigar);
return; return true;
} }
readCigar.add(new CigarElement(endOfFirstBlock - myPosOnAlt, CigarOperator.M)); readCigar.add(new CigarElement(endOfFirstBlock - myPosOnAlt, CigarOperator.M));
} }
@ -901,7 +908,7 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
if ( myPosOnAlt + aRead.getReadLength() < endOfFirstBlock + indelCE.getLength() ) { if ( myPosOnAlt + aRead.getReadLength() < endOfFirstBlock + indelCE.getLength() ) {
readCigar.add(new CigarElement(myPosOnAlt + aRead.getReadLength() - endOfFirstBlock, CigarOperator.I)); readCigar.add(new CigarElement(myPosOnAlt + aRead.getReadLength() - endOfFirstBlock, CigarOperator.I));
aRead.setCigar(readCigar); aRead.setCigar(readCigar);
return; return true;
} }
// for reads that start in an insertion // for reads that start in an insertion
@ -925,7 +932,7 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
aRead.setAlignmentStart(leftmostIndex + myPosOnAlt + indelOffsetOnRef - indelOffsetOnRead); aRead.setAlignmentStart(leftmostIndex + myPosOnAlt + indelOffsetOnRef - indelOffsetOnRead);
readCigar.add(new CigarElement(aRead.getReadLength(), CigarOperator.M)); readCigar.add(new CigarElement(aRead.getReadLength(), CigarOperator.M));
aRead.setCigar(readCigar); aRead.setCigar(readCigar);
return; return true;
} }
int readRemaining = aRead.getReadBases().length; int readRemaining = aRead.getReadBases().length;
@ -936,6 +943,8 @@ public class IndelRealigner extends ReadWalker<Integer, Integer> {
if ( readRemaining > 0 ) if ( readRemaining > 0 )
readCigar.add(new CigarElement(readRemaining, CigarOperator.M)); readCigar.add(new CigarElement(readRemaining, CigarOperator.M));
aRead.setCigar(readCigar); aRead.setCigar(readCigar);
return true;
} }
private boolean alternateReducesEntropy(final List<AlignedRead> reads, final byte[] reference, final long leftmostIndex) { private boolean alternateReducesEntropy(final List<AlignedRead> reads, final byte[] reference, final long leftmostIndex) {