-// NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work\r
- for (int i = 0; i < len; i++) {\r
- //SequenceI tmp = seqs[i];\r
- align.getSequences().setElementAt(seqs[nSeq-i-1],i);\r
- align.getSequences().setElementAt(seqs[i],nSeq-i-1);\r
+ /**\r
+ * Sorts the alignment by size of group.\r
+ * <br>Maintains the order of sequences in each group\r
+ * by order in given alignment object.\r
+ *\r
+ * @param align sorts the given alignment object by group\r
+ */\r
+ public static void sortByGroup(AlignmentI align)\r
+ {\r
+ //MAINTAINS ORIGNAL SEQUENCE ORDER,\r
+ //ORDERS BY GROUP SIZE\r
+ Vector groups = new Vector();\r
+\r
+ if (groups.hashCode() != lastGroupHash)\r
+ {\r
+ sortGroupAscending = true;\r
+ lastGroupHash = groups.hashCode();\r
+ }\r
+ else\r
+ {\r
+ sortGroupAscending = !sortGroupAscending;\r
+ }\r
+\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
+\r
+ if (sg.getSize() > sg2.getSize())\r
+ {\r
+ groups.insertElementAt(sg, j);\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (!groups.contains(sg))\r
+ {\r
+ groups.addElement(sg);\r
+ }\r
+ }\r
+\r
+ //NOW ADD SEQUENCES MAINTAINING ALIGNMENT ORDER\r
+ ///////////////////////////////////////////////\r
+ Vector seqs = new Vector();\r
+\r
+ for (int i = 0; i < groups.size(); i++)\r
+ {\r
+ SequenceGroup sg = (SequenceGroup) groups.elementAt(i);\r
+ SequenceI[] orderedseqs = sg.getSequencesInOrder(align);\r
+\r
+ for (int j = 0; j < orderedseqs.length; j++)\r
+ {\r
+ seqs.addElement(orderedseqs[j]);\r
+ }\r
+ }\r
+\r
+ if (sortGroupAscending)\r
+ {\r
+ setOrder(align, seqs);\r
+ }\r
+ else\r
+ {\r
+ setReverseOrder(align,\r
+ vectorSubsetToArray(seqs, align.getSequences()));\r
+ }\r