JAL-1705 helper method for mapping excluding stop codon
[jalview.git] / src / jalview / util / MappingUtils.java
index 1bbfc73..267e871 100644 (file)
@@ -768,4 +768,55 @@ public final class MappingUtils
     }
     return result;
   }
+
+  /**
+   * Remove the last 3 mapped positions from the given ranges
+   * 
+   * @param ranges
+   * @param mappedLength
+   */
+  public static void unmapStopCodon(List<int[]> ranges,
+          int mappedLength)
+  {
+    if (mappedLength < 3)
+    {
+      return;
+    }
+    boolean done = false;
+    int targetLength = mappedLength - 3;
+    int mapped = 0;
+    Iterator<int[]> it = ranges.iterator();
+    while (!done && it.hasNext())
+    {
+      int[] range = it.next();
+      int length = Math.abs(range[1] - range[0]) + 1;
+      if (mapped + length == targetLength)
+      {
+        done = true;
+      }
+      else if (mapped + length < targetLength)
+      {
+        mapped += length;
+        continue;
+      }
+      else
+      {
+        /*
+         * need just a bit of this range
+         */
+        int needed = targetLength - mapped;
+        int sense = range[1] >= range[0] ? 1 : -1;
+        range[1] = range[0] + (sense * (needed - 1));
+        done = true;
+      }
+    }
+    /*
+     * remove any trailing ranges
+     */
+    while (it.hasNext())
+    {
+      it.next();
+      it.remove();
+    }
+  }
 }