X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=60052088892beded922573870b3b1b3060c3e5a9;hp=81bddc2ebd637e7908687360a56e373447ce83e1;hb=4a3def9f59cefe629c9a33d87483283aee085928;hpb=eca4795050a0f7eca3d5dece68eaa54987cebd15 diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index 81bddc2..6005208 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -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 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 getOrderByTree(TreeI aptxTree, + Map nodesWithBoundSeqs) + { + List seqsByTreeOrder = new ArrayList<>(); + if (!aptxTree.isEmpty()) + { + for (final Iterator 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 nodesBoundToSequences, + TreeI treeI) throws IllegalArgumentException + { + List 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 _sortByTree(SequenceNode node, - List tmp, List seqset) + List 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