X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=9f9b7747b173cf7c05640990662419c2f8103a75;hb=c58f08345070f16bdc228c5e272db1bfd9cb6241;hp=b5cefe0baa860082d1fa6093782270c5cf839e69;hpb=be762d8d9c71a7aa3121e845c45911c7192b7827;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index b5cefe0..9f9b774 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; /* @@ -182,7 +187,7 @@ public class AlignmentSorter List algn; synchronized (algn = align.getSequences()) { - List tmp = new ArrayList(); + List tmp = new ArrayList<>(); for (int i = 0; i < seqs.length; i++) { @@ -279,7 +284,7 @@ public class AlignmentSorter { // MAINTAINS ORIGNAL SEQUENCE ORDER, // ORDERS BY GROUP SIZE - List groups = new ArrayList(); + List groups = new ArrayList<>(); if (groups.hashCode() != lastGroupHash) { @@ -315,7 +320,7 @@ public class AlignmentSorter // NOW ADD SEQUENCES MAINTAINING ALIGNMENT ORDER // ///////////////////////////////////////////// - List seqs = new ArrayList(); + List seqs = new ArrayList<>(); for (int i = 0; i < groups.size(); i++) { @@ -357,7 +362,7 @@ public class AlignmentSorter // tmp2 = tmp.retainAll(mask); // return tmp2.addAll(mask.removeAll(tmp2)) - ArrayList seqs = new ArrayList(); + ArrayList seqs = new ArrayList<>(); int i, idx; boolean[] tmask = new boolean[mask.size()]; @@ -436,9 +441,9 @@ public class AlignmentSorter { int nSeq = align.getHeight(); - List tmp = new ArrayList(); + 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