JAL-1953 2.11.2 with Archeopteryx!
[jalview.git] / src / jalview / analysis / AlignmentSorter.java
index 81bddc2..6005208 100755 (executable)
@@ -29,12 +29,15 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.SequenceNode;
+import jalview.ext.treeviewer.TreeI;
+import jalview.ext.treeviewer.TreeNodeI;
 import jalview.util.QuickSort;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Routines for manipulating the order of a multiple sequence alignment TODO:
@@ -69,6 +72,8 @@ public class AlignmentSorter
 
   static TreeModel lastTree = null;
 
+  static TreeI lastExternalTree = null;
+
   static boolean sortTreeAscending = true;
 
   /*
@@ -438,7 +443,7 @@ public class AlignmentSorter
 
     List<SequenceI> tmp = new ArrayList<>();
 
-    tmp = _sortByTree(tree.getTopNode(), tmp, align.getSequences());
+    tmp = _sortByTree(tree.getTopNode(), tmp);
 
     if (tmp.size() != nSeq)
     {
@@ -461,6 +466,27 @@ public class AlignmentSorter
     return tmp;
   }
 
+
+
+  private static List<SequenceI> getOrderByTree(TreeI aptxTree,
+          Map<TreeNodeI, SequenceI> nodesWithBoundSeqs)
+  {
+    List<SequenceI> seqsByTreeOrder = new ArrayList<>();
+    if (!aptxTree.isEmpty())
+    {
+      for (final Iterator<TreeNodeI> iter = aptxTree
+              .iterateInPreOrder(); iter.hasNext();)
+      {
+        TreeNodeI treeNode = iter.next();
+        seqsByTreeOrder.add(nodesWithBoundSeqs.get(treeNode));
+      }
+
+    }
+    return seqsByTreeOrder;
+
+
+  }
+
   /**
    * Sorts the alignment by a given tree
    * 
@@ -496,6 +522,48 @@ public class AlignmentSorter
   }
 
   /**
+   * Sorts the alignment by a given tree from Archaeopteryx
+   * 
+   * @param align
+   *          alignment to order
+   * @param tree
+   *          tree which has
+   */
+  public static void sortByTree(AlignmentI align,
+          Map<TreeNodeI, SequenceI> nodesBoundToSequences,
+          TreeI treeI) throws IllegalArgumentException
+  {
+    List<SequenceI> tmp = getOrderByTree(treeI, nodesBoundToSequences);
+
+    if (!tmp.isEmpty())
+    {
+      if (lastExternalTree != treeI)
+      {
+        sortTreeAscending = true;
+        lastExternalTree = treeI;
+      }
+      else
+      {
+        sortTreeAscending = !sortTreeAscending;
+      }
+
+      if (sortTreeAscending)
+      {
+        setOrder(align, tmp);
+      }
+      else
+      {
+        setReverseOrder(align,
+                vectorSubsetToArray(tmp, align.getSequences()));
+      }
+    }
+    else
+    {
+      throw new IllegalArgumentException();
+    }
+  }
+
+  /**
    * DOCUMENT ME!
    * 
    * @param align
@@ -535,7 +603,7 @@ public class AlignmentSorter
    * @return DOCUMENT ME!
    */
   private static List<SequenceI> _sortByTree(SequenceNode node,
-          List<SequenceI> tmp, List<SequenceI> seqset)
+          List<SequenceI> tmp)
   {
     if (node == null)
     {
@@ -564,13 +632,15 @@ public class AlignmentSorter
     }
     else
     {
-      _sortByTree(left, tmp, seqset);
-      _sortByTree(right, tmp, seqset);
+      _sortByTree(left, tmp);
+      _sortByTree(right, tmp);
     }
 
     return tmp;
   }
 
+
+
   // Ordering Objects
   // Alignment.sortBy(OrderObj) - sequence of sequence pointer refs in
   // appropriate order