new constructor and refactored methods for intersecting selection with alignment...
authorjprocter <Jim Procter>
Thu, 9 Dec 2010 15:31:33 +0000 (15:31 +0000)
committerjprocter <Jim Procter>
Thu, 9 Dec 2010 15:31:33 +0000 (15:31 +0000)
src/jalview/datamodel/CigarArray.java

index 626143e..3180298 100644 (file)
@@ -17,6 +17,8 @@
  */\r
 package jalview.datamodel;\r
 \r
+import java.util.Vector;\r
+\r
 public class CigarArray extends CigarBase\r
 {\r
   /**\r
@@ -72,6 +74,131 @@ public class CigarArray extends CigarBase
   }\r
 \r
   /**\r
+   * construct a cigar array from the current alignment, or just the subset of the current alignment specified by selectionGroup. Any columns marked as hidden in columnSelection will be marked as deleted in the array.\r
+   * @param alignment\r
+   * @param columnSelection \r
+   * @param selectionGroup\r
+   */\r
+  public CigarArray(AlignmentI alignment, ColumnSelection columnSelection, SequenceGroup selectionGroup)\r
+  {\r
+    this(constructSeqCigarArray(alignment, selectionGroup));\r
+    constructFromAlignment(alignment, columnSelection!=null ? columnSelection.getHiddenColumns() : null, selectionGroup);\r
+  }\r
+  private static int[] _calcStartEndBounds(AlignmentI alignment, SequenceGroup selectionGroup)\r
+  {\r
+    int[] startend = new int[] { 0,0,0};\r
+    if (selectionGroup != null)\r
+    {\r
+      startend[0] = selectionGroup.getSize();\r
+      startend[1] = selectionGroup.getStartRes();\r
+      startend[2] = selectionGroup.getEndRes(); // inclusive for start and end in\r
+      // SeqCigar constructor\r
+    }\r
+    else\r
+    {\r
+      startend[0] = alignment.getHeight();\r
+      startend[2] = alignment.getWidth() - 1;\r
+    }\r
+    return startend;\r
+  }\r
+  public static SeqCigar[] constructSeqCigarArray(AlignmentI alignment, SequenceGroup selectionGroup)\r
+  {\r
+    SequenceI[] seqs = null;\r
+    int i, iSize;\r
+    int _startend[] = _calcStartEndBounds(alignment, selectionGroup);\r
+    int start = _startend[1],end=_startend[2];\r
+    if (selectionGroup != null)\r
+    {\r
+      iSize = selectionGroup.getSize();\r
+      seqs = selectionGroup.getSequencesInOrder(alignment);\r
+      start = selectionGroup.getStartRes();\r
+      end = selectionGroup.getEndRes(); // inclusive for start and end in\r
+      // SeqCigar constructor\r
+    }\r
+    else\r
+    {\r
+      iSize = alignment.getHeight();\r
+      seqs = alignment.getSequencesArray();\r
+      end = alignment.getWidth() - 1;\r
+    }\r
+    SeqCigar[] selseqs = new SeqCigar[iSize];\r
+    for (i = 0; i < iSize; i++)\r
+    {\r
+      selseqs[i] = new SeqCigar(seqs[i], start, end);\r
+    }\r
+    return selseqs;\r
+  }\r
+  /**\r
+   * internal constructor function - called by CigarArray(AlignmentI, ...);\r
+   * @param alignment\r
+   * @param columnSelection - vector of visible regions as returned from columnSelection.getHiddenColumns() \r
+   * @param selectionGroup\r
+   */\r
+  private void constructFromAlignment(AlignmentI alignment, Vector columnSelection, SequenceGroup selectionGroup)\r
+  {\r
+    int[] _startend = _calcStartEndBounds(alignment, selectionGroup);\r
+    int start = _startend[1],end=_startend[2];\r
+    // now construct the CigarArray operations\r
+    if (columnSelection!=null)\r
+    {\r
+      int[] region;\r
+      int hideStart, hideEnd;\r
+      int last = start;\r
+      for (int j = 0; last < end & j < columnSelection.size(); j++)\r
+      {\r
+        region = (int[]) columnSelection.elementAt(j);\r
+        hideStart = region[0];\r
+        hideEnd = region[1];\r
+        // edit hidden regions to selection range\r
+        if (hideStart < last)\r
+        {\r
+          if (hideEnd > last)\r
+          {\r
+            hideStart = last;\r
+          }\r
+          else\r
+          {\r
+            continue;\r
+          }\r
+        }\r
+\r
+        if (hideStart > end)\r
+        {\r
+          break;\r
+        }\r
+\r
+        if (hideEnd > end)\r
+        {\r
+          hideEnd = end;\r
+        }\r
+\r
+        if (hideStart > hideEnd)\r
+        {\r
+          break;\r
+        }\r
+        /**\r
+         * form operations...\r
+         */\r
+        if (last < hideStart)\r
+        {\r
+          addOperation(CigarArray.M, hideStart - last);\r
+        }\r
+        addOperation(CigarArray.D, 1 + hideEnd - hideStart);\r
+        last = hideEnd + 1;\r
+      }\r
+      // Final match if necessary.\r
+      if (last < end)\r
+      {\r
+        addOperation(CigarArray.M, end - last + 1);\r
+      }\r
+    }\r
+    else\r
+    {\r
+      addOperation(CigarArray.M, end - start + 1);\r
+    }\r
+  }\r
+\r
+  /**\r
    * @see Cigar.getSequenceAndDeletions\r
    * @param GapChar\r
    *          char\r