method to construct sequence mapping for matching positions in aligned sequences
authorjprocter <jprocter@compbio.dundee.ac.uk>
Sat, 17 Nov 2012 18:35:43 +0000 (18:35 +0000)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Sat, 17 Nov 2012 18:35:43 +0000 (18:35 +0000)
src/jalview/analysis/AlignSeq.java

index 3ede7a8..832f519 100755 (executable)
@@ -940,7 +940,80 @@ public class AlignSeq
     return as;
   }
 
+  /**
+   * 
+   * @return mapping from positions in S1 to corresponding positions in S2
+   */
+  public jalview.datamodel.Mapping getMappingFromS1(boolean allowmismatch)
+  {
+    ArrayList<Integer> as1 = new ArrayList<Integer>(), as2 = new ArrayList<Integer>();
+    int pdbpos = s2.getStart() + getSeq2Start() - 2;
+    int alignpos = s1.getStart() + getSeq1Start() - 2;
+    int lp2 = pdbpos - 3, lp1 = alignpos - 3;
+    boolean lastmatch = false;
+    // and now trace the alignment onto the atom set.
+    for (int i = 0; i < astr1.length(); i++)
+    {
+      char c1 = astr1.charAt(i), c2 = astr2.charAt(i);
+      if (c1 != '-')
+      {
+        alignpos++;
+      }
+
+      if (c2 != '-')
+      {
+        pdbpos++;
+      }
+
+      if (allowmismatch || c1 == c2)
+      {
+        lastmatch = true;
+        // extend mapping interval.
+        if (lp1 + 1 != alignpos)
+        {
+          as1.add(Integer.valueOf(alignpos));
+          lp1 = alignpos;
+        }
+
+        if (lp2 + 1 != pdbpos)
+        {
+          as2.add(Integer.valueOf(pdbpos));
+          lp2 = pdbpos;
+        }
+      }
+      else
+      {
+        lastmatch = false;
+      }
+    }
+    // construct range pairs
+    int[] mapseq1 = new int[as1.size() + (lastmatch ? 1 : 0)], mapseq2 = new int[as2
+            .size() + (lastmatch ? 1 : 0)];
+    int i = 0;
+    for (Integer ip : as1)
+    {
+      mapseq1[i++] = ip;
+    }
+    ;
+    i = 0;
+    for (Integer ip : as2)
+    {
+      mapseq2[i++] = ip;
+    }
+    ;
+    if (lastmatch)
+    {
+      mapseq1[mapseq1.length - 1] = alignpos;
+      mapseq2[mapseq2.length - 1] = pdbpos;
+    }
+    MapList map = new MapList(mapseq1, mapseq2, 1, 1);
 
+    jalview.datamodel.Mapping mapping = new Mapping(map);
+    mapping.setTo(s2);
+    return mapping;
+  }
+
+  /**
    * compute the PID vector used by the redundancy filter.
    * 
    * @param originalSequences