diff --git a/public/java/src/org/broadinstitute/sting/utils/locusiterator/ReadStateManager.java b/public/java/src/org/broadinstitute/sting/utils/locusiterator/ReadStateManager.java
index 8fbd302a8..9728bdb1c 100644
--- a/public/java/src/org/broadinstitute/sting/utils/locusiterator/ReadStateManager.java
+++ b/public/java/src/org/broadinstitute/sting/utils/locusiterator/ReadStateManager.java
@@ -28,7 +28,6 @@ package org.broadinstitute.sting.utils.locusiterator;
import com.google.java.contract.Ensures;
import com.google.java.contract.Requires;
import net.sf.picard.util.PeekableIterator;
-import org.apache.log4j.Logger;
import org.broadinstitute.sting.utils.sam.GATKSAMRecord;
import java.util.*;
diff --git a/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java b/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java
index 2208302fb..e48d1ca4c 100644
--- a/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java
+++ b/public/java/src/org/broadinstitute/sting/utils/sam/AlignmentUtils.java
@@ -581,8 +581,11 @@ public final class AlignmentUtils {
*/
@Ensures({"result != null"})
public static Cigar consolidateCigar( final Cigar c ) {
- if( c == null ) { throw new IllegalArgumentException("Cigar cannot be null"); }
- if( c.isEmpty() ) { return c; }
+ if ( c == null ) { throw new IllegalArgumentException("Cigar cannot be null"); }
+
+ // fast check to determine if there's anything worth doing before we create new Cigar and actually do some work
+ if ( ! needsConsolidation(c) )
+ return c;
final Cigar returnCigar = new Cigar();
int sumLength = 0;
@@ -601,13 +604,33 @@ public final class AlignmentUtils {
lastElement = cur;
}
- if( sumLength > 0 ) {
+ if ( sumLength > 0 ) {
returnCigar.add(new CigarElement(sumLength, lastElement.getOperator()));
}
return returnCigar;
}
+ /**
+ * Does the cigar C need to be consolidated?
+ *
+ * @param c a non-null cigar
+ * @return true if so
+ */
+ private static boolean needsConsolidation(final Cigar c) {
+ if ( c.numCigarElements() <= 1 )
+ return false; // fast path for empty or single cigar
+
+ CigarOperator lastOp = null;
+ for( final CigarElement cur : c.getCigarElements() ) {
+ if ( cur.getLength() == 0 || lastOp == cur.getOperator() )
+ return true;
+ lastOp = cur.getOperator();
+ }
+
+ return false;
+ }
+
/**
* Takes the alignment of the read sequence readSeq to the reference sequence refSeq
* starting at 0-based position refIndex on the refSeq and specified by its cigar.