formatting
[jalview.git] / src / jalview / datamodel / CigarArray.java
index 6842f4a..6e0ab9f 100644 (file)
@@ -1,23 +1,24 @@
 /*\r
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)\r
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle\r
  * \r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
+ * This file is part of Jalview.\r
  * \r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
+ * Jalview is free software: you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License \r
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\r
  * \r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE.  See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
  */\r
 package jalview.datamodel;\r
 \r
+import java.util.Vector;\r
+\r
 public class CigarArray extends CigarBase\r
 {\r
   /**\r
@@ -52,7 +53,7 @@ public class CigarArray extends CigarBase
    * any of cigar are actually CigarArrays.\r
    * \r
    * @param cigar\r
-   *                Cigar[]\r
+   *          Cigar[]\r
    */\r
   public CigarArray(CigarSimple[] cigars)\r
   {\r
@@ -73,9 +74,151 @@ public class CigarArray extends CigarBase
   }\r
 \r
   /**\r
+   * construct a cigar array from the current alignment, or just the subset of\r
+   * the current alignment specified by selectionGroup. Any columns marked as\r
+   * hidden in columnSelection will be marked as deleted in the array.\r
+   * \r
+   * @param alignment\r
+   * @param columnSelection\r
+   * @param selectionGroup\r
+   */\r
+  public CigarArray(AlignmentI alignment, ColumnSelection columnSelection,\r
+          SequenceGroup selectionGroup)\r
+  {\r
+    this(constructSeqCigarArray(alignment, selectionGroup));\r
+    constructFromAlignment(alignment,\r
+            columnSelection != null ? columnSelection.getHiddenColumns()\r
+                    : null, selectionGroup);\r
+  }\r
+\r
+  private static int[] _calcStartEndBounds(AlignmentI alignment,\r
+          SequenceGroup selectionGroup)\r
+  {\r
+    int[] startend = new int[]\r
+    { 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\r
+                                                // 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
+\r
+  public static SeqCigar[] constructSeqCigarArray(AlignmentI alignment,\r
+          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
+  /**\r
+   * internal constructor function - called by CigarArray(AlignmentI, ...);\r
+   * \r
+   * @param alignment\r
+   * @param columnSelection\r
+   *          - vector of visible regions as returned from\r
+   *          columnSelection.getHiddenColumns()\r
+   * @param selectionGroup\r
+   */\r
+  private void constructFromAlignment(AlignmentI alignment,\r
+          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
+   *          char\r
    * @return Object[][]\r
    */\r
   protected Object[][] getArrayofSequenceAndDeletions(char GapChar)\r
@@ -106,7 +249,7 @@ public class CigarArray extends CigarBase
    * @return String formed by newline concatenated results of applying CIGAR\r
    *         operations to each reference object in turn.\r
    * @param GapChar\r
-   *                char\r
+   *          char\r
    * @return '\n' separated strings (empty results included as \n\n)\r
    */\r
   public String getSequenceString(char GapChar)\r
@@ -133,7 +276,7 @@ public class CigarArray extends CigarBase
    * return string results of applying cigar string to all reference cigars\r
    * \r
    * @param GapChar\r
-   *                char\r
+   *          char\r
    * @return String[]\r
    */\r
   public String[] getSequenceStrings(char GapChar)\r
@@ -158,9 +301,9 @@ public class CigarArray extends CigarBase
    * \r
    * @return Cigar[]\r
    * \r
-   * public CigarBase[] getEditedCigars() {\r
+   *         public CigarBase[] getEditedCigars() {\r
    * \r
-   * return new CigarBase[] {}; }\r
+   *         return new CigarBase[] {}; }\r
    */\r
   /**\r
    * applyDeletions edits underlying refCigars to propagate deleted regions, and\r
@@ -199,7 +342,7 @@ public class CigarArray extends CigarBase
         int delstart = cursor, delend = cursor + range[i] - 1; // inclusive\r
         delpos.addElement(new int[]\r
         { vcursor + offset, range[i] }); // index of right hand column after\r
-                                          // hidden region boundary\r
+        // hidden region boundary\r
         offset += range[i] - 1; // shift in visible column coordinates\r
         System.arraycopy(operation, i + 1, operation, i, length - i);\r
         System.arraycopy(range, i + 1, range, i, length - i);\r