Use selection area with hidden columns in calculations
[jalview.git] / src / jalview / gui / AlignViewport.java
index edbfde5..2e1a4e0 100755 (executable)
@@ -1143,4 +1143,106 @@ public class AlignViewport
     {\r
       return alignment.getHiddenSequences().adjustForHiddenSeqs(alignmentIndex);\r
     }\r
+\r
+    /**\r
+     * This method returns the a new SequenceI [] with\r
+     * the selection sequence and start and end points adjusted\r
+     * @return String[]\r
+     */\r
+    public SequenceI[] getSelectionAsNewSequence()\r
+    {\r
+      SequenceI[] sequences;\r
+\r
+      if (selectionGroup == null)\r
+        sequences = alignment.getSequencesArray();\r
+      else\r
+        sequences = selectionGroup.getSelectionAsNewSequences(alignment);\r
+\r
+      return sequences;\r
+    }\r
+\r
+\r
+    /**\r
+     * This method returns the visible selected area as text, as\r
+     * seen on the GUI, ie if columns are hidden they will not\r
+     * be returned in the result.\r
+     * Use this for calculating trees, PCA, redundancy etc on views\r
+     * which contain hidden columns.\r
+     * @return String[]\r
+     */\r
+    public String [] getSelectionAsString()\r
+    {\r
+      String [] selection = null;\r
+      SequenceI [] seqs= null;\r
+      int i, iSize;\r
+      int start = 0, end = 0;\r
+      if(selectionGroup!=null)\r
+      {\r
+        iSize = selectionGroup.getSize(false);\r
+        seqs = selectionGroup.getSequencesInOrder(alignment);\r
+        start = selectionGroup.getStartRes();\r
+        end = selectionGroup.getEndRes()+1;\r
+      }\r
+      else\r
+      {\r
+        iSize = alignment.getHeight();\r
+        seqs = alignment.getSequencesArray();\r
+        end = alignment.getWidth();\r
+      }\r
+\r
+      selection = new String[iSize];\r
+\r
+\r
+      for(i=0; i<iSize; i++)\r
+      {\r
+        if (hasHiddenColumns)\r
+        {\r
+             StringBuffer visibleSeq = new StringBuffer();\r
+             Vector regions = colSel.getHiddenColumns();\r
+\r
+             int blockStart = start, blockEnd=end;\r
+             int [] region;\r
+             int hideStart, hideEnd;\r
+\r
+             for (int j = 0; j < regions.size(); j++)\r
+             {\r
+               region = (int[]) regions.elementAt(j);\r
+               hideStart = region[0];\r
+               hideEnd = region[1];\r
+\r
+               if(hideStart < start)\r
+               {\r
+                 continue;\r
+               }\r
+\r
+               blockStart = Math.min(blockStart, hideEnd+1);\r
+               blockEnd = Math.min(blockEnd, hideStart);\r
+\r
+               if(blockStart>blockEnd)\r
+               {\r
+                  break;\r
+               }\r
+\r
+\r
+               visibleSeq.append(seqs[i].getSequence(blockStart, blockEnd));\r
+\r
+               blockStart = hideEnd+1;\r
+               blockEnd = end;\r
+             }\r
+\r
+             if(end>blockStart)\r
+               visibleSeq.append(seqs[i].getSequence(blockStart, end));\r
+\r
+             selection[i] = visibleSeq.toString();\r
+        }\r
+        else\r
+        {\r
+          selection[i] = seqs[i].getSequence(start, end);\r
+        }\r
+\r
+    //    System.out.println(seqs[i].getName()+"\t"+ selection[i]);\r
+      }\r
+\r
+      return selection;\r
+    }\r
 }\r