JAL-2147 findMappingsBetweenSequenceAndOthers for scoping search to sequences in...
[jalview.git] / src / jalview / util / MappingUtils.java
index c2cad1f..515ff51 100644 (file)
@@ -754,6 +754,13 @@ public final class MappingUtils
   public static List<AlignedCodonFrame> findMappingsForSequence(
           SequenceI sequence, List<AlignedCodonFrame> mappings)
   {
+    return findMappingsForSequenceAndOthers(sequence, mappings, null);
+  }
+
+  public static List<AlignedCodonFrame> findMappingsForSequenceAndOthers(
+          SequenceI sequence, List<AlignedCodonFrame> mappings,
+          AlignmentI alignment)
+  {
     List<AlignedCodonFrame> result = new ArrayList<AlignedCodonFrame>();
     if (sequence == null || mappings == null)
     {
@@ -763,14 +770,39 @@ public final class MappingUtils
     {
       if (mapping.involvesSequence(sequence))
       {
-        result.add(mapping);
+        if (alignment != null)
+        {
+          for (SequenceI otherseq : alignment.getSequences())
+          {
+            if (otherseq == sequence
+                    || (otherseq.getDatasetSequence() != null && (otherseq
+                            .getDatasetSequence() == sequence || otherseq
+                            .getDatasetSequence() == sequence
+                            .getDatasetSequence())))
+            {
+              // skip sequences in subset which directly relate to sequence
+              continue;
+            }
+            if (mapping.involvesSequence(otherseq))
+            {
+              // selected a mapping contained in subselect alignment
+              result.add(mapping);
+              break;
+            }
+          }
+        }
+        else
+        {
+          result.add(mapping);
+        }
       }
     }
     return result;
   }
 
   /**
-   * Returns the total length of the supplied ranges
+   * Returns the total length of the supplied ranges, which may be as single
+   * [start, end] or multiple [start, end, start, end ...]
    * 
    * @param ranges
    * @return
@@ -784,7 +816,16 @@ public final class MappingUtils
     int length = 0;
     for (int[] range : ranges)
     {
-      length += Math.abs(range[1] - range[0]) + 1;
+      if (range.length % 2 != 0)
+      {
+        System.err.println("Error unbalance start/end ranges: "
+                + ranges.toString());
+        return 0;
+      }
+      for (int i = 0; i < range.length - 1; i += 2)
+      {
+        length += Math.abs(range[i + 1] - range[i]) + 1;
+      }
     }
     return length;
   }
@@ -848,7 +889,6 @@ public final class MappingUtils
     int cdspos = 0;
     for (int x = 0; x < copy.length && sxpos == -1; x += 2)
     {
-      // fixme handle reverse strand
       cdspos += Math.abs(copy[x + 1] - copy[x]) + 1;
       if (removeCount < cdspos)
       {