several ordering bug fixes.
authorjprocter <Jim Procter>
Tue, 24 May 2005 08:42:45 +0000 (08:42 +0000)
committerjprocter <Jim Procter>
Tue, 24 May 2005 08:42:45 +0000 (08:42 +0000)
src/jalview/analysis/AlignmentSorter.java

index 58fd444..40ad372 100755 (executable)
@@ -11,6 +11,14 @@ import java.util.*;
 public class AlignmentSorter {\r
 \r
   private AlignmentSorter() {\r
+    try\r
+    {\r
+      jbInit();\r
+    }\r
+    catch (Exception ex)\r
+    {\r
+      ex.printStackTrace();\r
+    }\r
   }\r
 \r
   public static void sortGroups(AlignmentI align) {\r
@@ -110,11 +118,17 @@ public class AlignmentSorter {
 \r
     sortIdAscending = !sortIdAscending;\r
   }\r
-\r
+  static int lastGroupHash = 0;\r
   static boolean sortGroupAscending = true;\r
+\r
   public static void sortByGroup(AlignmentI align) {\r
     int    nSeq = align.getHeight();\r
     Vector groups = align.getGroups();\r
+    if (groups.hashCode()!=lastGroupHash) {\r
+      sortGroupAscending=true;\r
+      lastGroupHash = groups.hashCode();\r
+    } else\r
+      sortGroupAscending = ! sortGroupAscending;\r
 \r
     Vector seqs = new Vector();\r
 \r
@@ -126,19 +140,20 @@ public class AlignmentSorter {
       }\r
     }\r
 \r
-    if (seqs.size() != nSeq) {\r
+    // Deletions can happen so this check may fail\r
+    /*\r
+     if (seqs.size() != nSeq) {\r
       System.err.println("ERROR: tmp.size() != nseq in sortByGroups");\r
       if (seqs.size() < nSeq) {\r
         addStrays(align,seqs);\r
       }\r
     }\r
-\r
+*/\r
     if(sortGroupAscending)\r
       setOrder(align,seqs);\r
     else\r
-      setReverseOrder( align, vectorToArray(seqs));\r
+      setReverseOrder( align, vectorSubsetToArray(seqs, align.getSequences()));\r
 \r
-    sortGroupAscending = ! sortGroupAscending;\r
   }\r
 \r
   private static SequenceI [] vectorToArray(Vector tmp) {\r
@@ -170,15 +185,25 @@ public class AlignmentSorter {
     return vectorToArray(seqs);\r
   }\r
 \r
+  static AlignmentOrder lastOrder = null;\r
+  static boolean sortOrderAscending = true;\r
 \r
   public static void sortBy(AlignmentI align, AlignmentOrder order) {\r
     // Get an ordered vector of sequences which may also be present in align\r
     Vector tmp = order.getOrder();\r
 //    if (tmp.size()<align.getHeight())\r
 //      addStrays(align, tmp);\r
-    setOrder(align, tmp);\r
-  }\r
+    if (lastOrder==order)\r
+      sortOrderAscending=!sortOrderAscending;\r
+    else\r
+      sortOrderAscending=true;\r
 \r
+    if (sortOrderAscending)\r
+      setOrder(align, tmp);\r
+    else\r
+      setReverseOrder(align, vectorSubsetToArray(tmp, align.getSequences()));\r
+  }\r
+  static NJTree lastTree = null;\r
   static boolean sortTreeAscending = true;\r
 \r
   public static Vector getOrderByTree(AlignmentI align, NJTree tree) {\r
@@ -208,12 +233,16 @@ public class AlignmentSorter {
   public static void sortByTree(AlignmentI align, NJTree tree) {\r
     Vector tmp = getOrderByTree(align, tree);\r
     // tmp should properly permute align with tree.\r
+    if(lastTree!=tree) {\r
+      sortTreeAscending = true;\r
+      lastTree = tree;\r
+    } else {\r
+      sortTreeAscending = !sortTreeAscending;\r
+    }\r
     if(sortTreeAscending)\r
       setOrder(align,tmp);\r
     else\r
       setReverseOrder(align, vectorSubsetToArray(tmp, align.getSequences()));\r
-\r
-      sortTreeAscending = !sortTreeAscending; // JBPNote: this is totally random - have to keep last tree sort ref ...\r
   }\r
 \r
   private static void addStrays(AlignmentI align, Vector seqs) {\r
@@ -262,4 +291,9 @@ public class AlignmentSorter {
     jalview.util.QuickSort.sort(ids, alignment);\r
   }\r
 \r
+  private void jbInit()\r
+      throws Exception\r
+  {\r
+  }\r
+\r
 }\r