Merge pull request #254 from broadinstitute/md_bad_merge

Fix error in merging code in HC
This commit is contained in:
MauricioCarneiro 2013-05-31 13:53:14 -07:00
commit 1143c12c44
3 changed files with 37 additions and 21 deletions

View File

@ -260,7 +260,7 @@ public class ReduceReadsIntegrationTest extends WalkerTest {
public void testDivideByZero() {
String base = String.format("-T ReduceReads %s -npt -R %s -I %s", DIVIDEBYZERO_L, REF, DIVIDEBYZERO_BAM) + " -o %s ";
// we expect to lose coverage due to the downsampling so don't run the systematic tests
executeTestWithoutAdditionalRRTests("testDivideByZero", new WalkerTestSpec(base, Arrays.asList("bam"), Arrays.asList("c459a6153a17c2cbf8441e1918fda9c8")));
executeTestWithoutAdditionalRRTests("testDivideByZero", new WalkerTestSpec(base, Arrays.asList("bam"), Arrays.asList("4f0ef477c0417d1eb602b323474ef377")));
}
/**

View File

@ -35,6 +35,7 @@ import org.broadinstitute.sting.utils.exceptions.UserException;
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;
import java.util.Vector;
@ -559,26 +560,34 @@ public class ClippingOp {
return new CigarShift(cleanCigar, shiftFromStart, shiftFromEnd);
}
/**
* Compute the offset of the first "real" position in the cigar on the genome
*
* This is defined as a first position after a run of Hs followed by a run of Ss
*
* @param cigar A non-null cigar
* @return the offset (from 0) of the first on-genome base
*/
private int calcHardSoftOffset(final Cigar cigar) {
final List<CigarElement> elements = cigar.getCigarElements();
int size = 0;
int i = 0;
while ( i < elements.size() && elements.get(i).getOperator() == CigarOperator.HARD_CLIP ) {
size += elements.get(i).getLength();
i++;
}
while ( i < elements.size() && elements.get(i).getOperator() == CigarOperator.SOFT_CLIP ) {
size += elements.get(i).getLength();
i++;
}
return size;
}
private int calculateAlignmentStartShift(Cigar oldCigar, Cigar newCigar) {
int newShift = 0;
int oldShift = 0;
boolean readHasStarted = false; // if the new cigar is composed of S and H only, we have to traverse the entire old cigar to calculate the shift
for (CigarElement cigarElement : newCigar.getCigarElements()) {
if (cigarElement.getOperator() == CigarOperator.HARD_CLIP || cigarElement.getOperator() == CigarOperator.SOFT_CLIP)
newShift += cigarElement.getLength();
else {
readHasStarted = true;
break;
}
}
for (CigarElement cigarElement : oldCigar.getCigarElements()) {
if (cigarElement.getOperator() == CigarOperator.HARD_CLIP || cigarElement.getOperator() == CigarOperator.SOFT_CLIP)
oldShift += cigarElement.getLength();
else if (readHasStarted)
break;
}
final int newShift = calcHardSoftOffset(newCigar);
final int oldShift = calcHardSoftOffset(oldCigar);
return newShift - oldShift;
}

View File

@ -48,7 +48,7 @@ import java.util.List;
public class ReadClipperUnitTest extends BaseTest {
List<Cigar> cigarList;
int maximumCigarSize = 6; // 6 is the minimum necessary number to try all combinations of cigar types with guarantee of clipping an element with length = 2
int maximumCigarSize = 10; // 6 is the minimum necessary number to try all combinations of cigar types with guarantee of clipping an element with length = 2
@BeforeClass
public void init() {
@ -391,4 +391,11 @@ public class ReadClipperUnitTest extends BaseTest {
}
}
@Test(enabled = true)
public void testRevertEntirelySoftclippedReads() {
GATKSAMRecord read = ReadClipperTestUtils.makeReadFromCigar("2H1S3H");
GATKSAMRecord clippedRead = ReadClipper.revertSoftClippedBases(read);
Assert.assertEquals(clippedRead.getAlignmentStart(), read.getSoftStart());
}
}