Sort Groups modified
authoramwaterhouse <Andrew Waterhouse>
Thu, 16 Jun 2005 13:31:23 +0000 (13:31 +0000)
committeramwaterhouse <Andrew Waterhouse>
Thu, 16 Jun 2005 13:31:23 +0000 (13:31 +0000)
src/jalview/analysis/AlignmentSorter.java
src/jalview/appletgui/AlignFrame.java
src/jalview/datamodel/SequenceGroup.java
src/jalview/gui/AlignFrame.java

index 7c2a554..bdd6bce 100755 (executable)
@@ -39,31 +39,6 @@ public class AlignmentSorter {
     static NJTree lastTree = null;\r
     static boolean sortTreeAscending = true;\r
 \r
-    private AlignmentSorter() {\r
-        try {\r
-            jbInit();\r
-        } catch (Exception ex) {\r
-            ex.printStackTrace();\r
-        }\r
-    }\r
-\r
-    public static void sortGroups(AlignmentI align) {\r
-        Vector groups = align.getGroups();\r
-        int nGroup = groups.size();\r
-\r
-        float[] arr = new float[nGroup];\r
-        Object[] s = new Object[nGroup];\r
-\r
-        for (int i = 0; i < nGroup; i++) {\r
-            arr[i] = ((SequenceGroup) groups.elementAt(i)).getSize();\r
-            s[i] = groups.elementAt(i);\r
-        }\r
-\r
-        QuickSort.sort(arr, s);\r
-\r
-        //  align..setGroups(newg);\r
-    }\r
-\r
     /**\r
      * Sort by Percentage Identity\r
      *\r
@@ -110,11 +85,13 @@ public class AlignmentSorter {
     }\r
 \r
     private static void setOrder(AlignmentI align, SequenceI[] seqs) {\r
+\r
         // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work\r
         Vector algn = align.getSequences();\r
-\r
-        for (int i = 0, p = 0; i < seqs.length; i++)\r
-            algn.setElementAt(seqs[i], p++);\r
+        for (int i = 0; i < seqs.length; i++)\r
+        {\r
+          algn.setElementAt(seqs[i], i);\r
+        }\r
     }\r
 \r
     public static void sortByID(AlignmentI align) {\r
@@ -140,7 +117,10 @@ public class AlignmentSorter {
     }\r
 \r
     public static void sortByGroup(AlignmentI align) {\r
-        Vector groups = align.getGroups();\r
+      //MAINTAINS ORIGNAL SEQUENCE ORDER,\r
+      //ORDERS BY GROUP SIZE\r
+\r
+        Vector groups = new Vector();\r
 \r
         if (groups.hashCode() != lastGroupHash) {\r
             sortGroupAscending = true;\r
@@ -149,26 +129,41 @@ public class AlignmentSorter {
             sortGroupAscending = !sortGroupAscending;\r
         }\r
 \r
-        Vector seqs = new Vector();\r
+        //SORTS GROUPS BY SIZE\r
+        //////////////////////\r
+        for(int i=0; i<align.getGroups().size(); i++)\r
+        {\r
+           SequenceGroup sg = (SequenceGroup) align.getGroups().elementAt(i);\r
+\r
+           for(int j=0; j<groups.size(); j++)\r
+           {\r
+             SequenceGroup sg2 = (SequenceGroup) groups.elementAt(j);\r
+             if(sg.getSize() > sg2.getSize())\r
+             {\r
+               groups.insertElementAt(sg, j);\r
+               break;\r
+             }\r
+           }\r
+\r
+           if (!groups.contains(sg))\r
+           {\r
+             groups.addElement(sg);\r
+           }\r
+        }\r
 \r
-        for (int i = 0; i < groups.size(); i++) {\r
+        //NOW ADD SEQUENCES MAINTAINING ALIGNMENT ORDER\r
+        ///////////////////////////////////////////////\r
+        Vector seqs = new Vector();\r
+        for (int i = 0; i < groups.size(); i++)\r
+        {\r
             SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
-\r
-            for (int j = 0; j < sg.getSize(); j++) {\r
-                seqs.addElement(sg.getSequenceAt(j));\r
+            SequenceI [] orderedseqs = sg.getSequencesInOrder(align);\r
+            for (int j = 0; j < orderedseqs.length; j++)\r
+            {\r
+                seqs.addElement(orderedseqs[j]);\r
             }\r
         }\r
 \r
-        // Deletions can happen so this check may fail\r
-\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
         if (sortGroupAscending) {\r
             setOrder(align, seqs);\r
         } else {\r
@@ -178,6 +173,7 @@ public class AlignmentSorter {
     }\r
 \r
     private static SequenceI[] vectorToArray(Vector tmp) {\r
+\r
         SequenceI[] seqs = new SequenceI[tmp.size()];\r
 \r
         for (int i = 0; i < tmp.size(); i++) {\r
@@ -190,20 +186,19 @@ public class AlignmentSorter {
     private static SequenceI[] vectorSubsetToArray(Vector tmp, Vector mask) {\r
         Vector seqs = new Vector();\r
         int i;\r
-        int m;\r
-        int p;\r
-        boolean[] tmask = new boolean[m = mask.size()];\r
+        boolean[] tmask = new boolean[mask.size()];\r
 \r
-        for (i = 0; i < m; i++)\r
+        for (i = 0; i < mask.size(); i++)\r
             tmask[i] = true;\r
 \r
         for (i = 0; i < tmp.size(); i++) {\r
-            Object sq;\r
 \r
-            if (mask.contains(sq = tmp.elementAt(i))) {\r
+            Object sq = tmp.elementAt(i);\r
+\r
+            if (mask.contains(sq) && tmask[mask.indexOf(sq)])\r
+            {\r
                 tmask[mask.indexOf(sq)] = false;\r
                 seqs.addElement(sq);\r
-                m--;\r
             }\r
         }\r
 \r
@@ -219,8 +214,6 @@ public class AlignmentSorter {
         // Get an ordered vector of sequences which may also be present in align\r
         Vector tmp = order.getOrder();\r
 \r
-        //    if (tmp.size()<align.getHeight())\r
-        //      addStrays(align, tmp);\r
         if (lastOrder == order) {\r
             sortOrderAscending = !sortOrderAscending;\r
         } else {\r
@@ -336,7 +329,4 @@ public class AlignmentSorter {
 \r
         jalview.util.QuickSort.sort(ids, alignment);\r
     }\r
-\r
-    private void jbInit() throws Exception {\r
-    }\r
 }\r
index bb4b58a..832f795 100755 (executable)
@@ -979,8 +979,8 @@ public class AlignFrame
     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
                                    HistoryItem.SORT));\r
     AlignmentSorter.sortByGroup(viewport.getAlignment());\r
-    AlignmentSorter.sortGroups(viewport.getAlignment());\r
     alignPanel.repaint();\r
+\r
   }\r
 \r
   public void removeRedundancyMenuItem_actionPerformed(ActionEvent e)\r
index 6f6850b..a262257 100755 (executable)
@@ -302,11 +302,11 @@ public class SequenceGroup
    * @param al Alignment\r
    * @return SequenceI[]\r
    */\r
-  public SequenceI[] getSequencesInOrder(Alignment al)\r
+  public SequenceI[] getSequencesInOrder(AlignmentI al)\r
   {\r
-    int sz;\r
+    int sz = sequences.size();\r
     java.util.Hashtable orderedSeqs = new java.util.Hashtable();\r
-    SequenceI[] seqs = new SequenceI[sz = sequences.size()];\r
+    SequenceI[] seqs = new SequenceI[sz];\r
 \r
     for (int i = 0; i < sz; i++)\r
     {\r
@@ -317,26 +317,12 @@ public class SequenceGroup
 \r
     int index = 0;\r
 \r
-    for (int i = 0; i < sz; i++)\r
+    for (int i = 0; i < al.getHeight(); i++)\r
     {\r
-      SequenceI seq = null;\r
-\r
-      while (seq == null)\r
-      {\r
-        if (orderedSeqs.containsKey(index + ""))\r
-        {\r
-          seq = (SequenceI) orderedSeqs.get(index + "");\r
-          index++;\r
-\r
-          break;\r
-        }\r
-        else\r
+        if (orderedSeqs.containsKey(i + ""))\r
         {\r
-          index++;\r
+          seqs[index++] =  (SequenceI) orderedSeqs.get(i + "");\r
         }\r
-      }\r
-\r
-      seqs[index] = seq;\r
     }\r
 \r
     return seqs;\r
index cc7ce48..7499b4e 100755 (executable)
@@ -1170,8 +1170,7 @@ public class AlignFrame
     addHistoryItem(new HistoryItem("Group Sort", viewport.alignment,\r
                                    HistoryItem.SORT));\r
 \r
-    //  AlignmentSorter.sortByGroup(viewport.getAlignment());\r
-    AlignmentSorter.sortGroups(viewport.getAlignment());\r
+    AlignmentSorter.sortByGroup(viewport.getAlignment());\r
     alignPanel.repaint();\r
   }\r
 \r