apply version 2.7 copyright
[jalview.git] / src / jalview / datamodel / CigarArray.java
index 6842f4a..78d34ed 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, 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,134 @@ 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
+   *          char\r
    * @return Object[][]\r
    */\r
   protected Object[][] getArrayofSequenceAndDeletions(char GapChar)\r
@@ -106,7 +232,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 +259,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 +284,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 +325,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