Realign existing indels (from the aligner) to leftmost position
git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@848 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
parent
aa17c4a468
commit
19f9ac2b05
|
|
@ -171,6 +171,10 @@ public class IntervalCleanerWalker extends LocusWindowWalker<Integer, Integer>
|
|||
|
||||
// decide which reads potentially need to be cleaned
|
||||
for ( SAMRecord read : reads ) {
|
||||
// first, move existing indels (for 1 indel reads only) to leftmost position within identical sequence
|
||||
if ( read.getAlignmentBlocks().size() == 2 )
|
||||
indelRealignment(read, reference, read.getAlignmentStart()-(int)leftmostIndex);
|
||||
|
||||
AlignedRead aRead = new AlignedRead(read);
|
||||
int mismatchScore = mismatchQualitySum(aRead, reference, read.getAlignmentStart()-(int)leftmostIndex);
|
||||
|
||||
|
|
@ -407,6 +411,45 @@ public class IntervalCleanerWalker extends LocusWindowWalker<Integer, Integer>
|
|||
aRead.getRead().setCigar(readCigar);
|
||||
}
|
||||
|
||||
private void indelRealignment(SAMRecord read, String refSeq, int refIndex) {
|
||||
Cigar cigar = read.getCigar();
|
||||
CigarElement ce1 = cigar.getCigarElement(0);
|
||||
CigarElement ce2 = cigar.getCigarElement(1);
|
||||
int difference = 0;
|
||||
|
||||
if ( ce2.getOperator() == CigarOperator.D ) {
|
||||
int indelIndex = refIndex + ce1.getLength();
|
||||
String indelString = refSeq.substring(indelIndex, indelIndex+ce2.getLength());
|
||||
int newIndex = indelIndex;
|
||||
while ( newIndex > 0 ) {
|
||||
String newIndelString = refSeq.substring(newIndex-1, newIndex+ce2.getLength()-1);
|
||||
if ( !indelString.equals(newIndelString) )
|
||||
break;
|
||||
newIndex--;
|
||||
}
|
||||
difference = indelIndex - newIndex;
|
||||
} else if ( ce2.getOperator() == CigarOperator.I ) {
|
||||
int indelIndex = ce1.getLength();
|
||||
String indelString = read.getReadString().substring(indelIndex, indelIndex+ce2.getLength());
|
||||
int newIndex = indelIndex;
|
||||
while ( newIndex > 0 ) {
|
||||
String newIndelString = read.getReadString().substring(newIndex-1, newIndex+ce2.getLength()-1);
|
||||
if ( !indelString.equals(newIndelString) )
|
||||
break;
|
||||
newIndex--;
|
||||
}
|
||||
difference = indelIndex - newIndex;
|
||||
}
|
||||
|
||||
if ( difference > 0 ) {
|
||||
Cigar newCigar = new Cigar();
|
||||
newCigar.add(new CigarElement(ce1.getLength()-difference, CigarOperator.M));
|
||||
newCigar.add(ce2);
|
||||
newCigar.add(new CigarElement(cigar.getCigarElement(2).getLength()+difference, CigarOperator.M));
|
||||
read.setCigar(newCigar);
|
||||
}
|
||||
}
|
||||
|
||||
private class AlignedRead {
|
||||
SAMRecord read;
|
||||
int mismatchScoreToReference;
|
||||
|
|
|
|||
Loading…
Reference in New Issue