diff --git a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java index bede50a0b..e83667e8c 100755 --- a/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java +++ b/public/java/src/org/broadinstitute/sting/gatk/walkers/indels/RealignerTargetCreator.java @@ -103,7 +103,7 @@ import java.util.List; @Allows(value={DataSource.READS, DataSource.REFERENCE}) @By(DataSource.REFERENCE) @BAQMode(ApplicationTime = BAQ.ApplicationTime.FORBIDDEN) -public class RealignerTargetCreator extends RodWalker { +public class RealignerTargetCreator extends RodWalker implements TreeReducible { /** * The target intervals for realignment. @@ -251,38 +251,117 @@ public class RealignerTargetCreator extends RodWalker 1 ) + sum.right = value; + else { + if ( sum.left.isReportableEvent() ) + out.println(sum.left.toString()); + sum.left = value; + } + } else { + if ( canBeMerged(sum.right, value) ) + sum.right = mergeEvents(sum.right, value); + else { + if ( sum.right.isReportableEvent() ) + out.println(sum.right.toString()); + sum.right = value; + } } - // otherwise, merge the two events - sum.merge(value); return sum; } + static private boolean canBeMerged(Event left, Event right) { + return left.loc.getContigIndex() == right.loc.getContigIndex() && left.furthestStopPos >= right.loc.getStart(); + } + + @com.google.java.contract.Requires({"left != null", "right != null"}) + static private Event mergeEvents(Event left, Event right) { + left.merge(right); + return left; + } + private enum EVENT_TYPE { POINT_EVENT, INDEL_EVENT, BOTH } + class EventPair { + public Event left, right; + + public EventPair(Event left, Event right) { + this.left = left; + this.right = right; + } + } + class Event { public int furthestStopPos;