X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=9f9b7747b173cf7c05640990662419c2f8103a75;hb=c58f08345070f16bdc228c5e272db1bfd9cb6241;hp=e7733e9b065ac3c9ce062cf054999ffdc9a01b87;hpb=60e252f7e0084336b0a85620842ce3db8f63e5b0;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index e7733e9..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; /* @@ -108,8 +113,9 @@ public class AlignmentSorter true); for (int i = 0; i < nSeq; i++) { - scores[i] = (float) PIDModel.computePID(align.getSequenceAt(i) - .getSequenceAsString(), refSeq, pidParams); + scores[i] = (float) PIDModel.computePID( + align.getSequenceAt(i).getSequenceAsString(), refSeq, + pidParams); seqs[i] = align.getSequenceAt(i); } @@ -181,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++) { @@ -278,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) { @@ -314,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++) { @@ -356,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()]; @@ -415,7 +421,8 @@ public class AlignmentSorter } else { - setReverseOrder(align, vectorSubsetToArray(tmp, align.getSequences())); + setReverseOrder(align, + vectorSubsetToArray(tmp, align.getSequences())); } } @@ -434,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) { @@ -450,18 +457,36 @@ public class AlignmentSorter if (tmp.size() != nSeq) { - System.err - .println("WARNING: tmp.size()=" - + tmp.size() - + " != nseq=" - + nSeq - + " in getOrderByTree - tree contains sequences not in alignment"); + System.err.println("WARNING: tmp.size()=" + tmp.size() + " != nseq=" + + nSeq + + " in getOrderByTree - tree contains sequences not in alignment"); } } 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 * @@ -491,7 +516,50 @@ public class AlignmentSorter } else { - setReverseOrder(align, vectorSubsetToArray(tmp, align.getSequences())); + setReverseOrder(align, + vectorSubsetToArray(tmp, align.getSequences())); + } + } + + /** + * 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(); } } @@ -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 @@ -681,27 +751,6 @@ public class AlignmentSorter public static String FEATURE_DENSITY = "density"; - private static boolean containsIgnoreCase(final String lab, - final List labs) - { - if (labs == null) - { - return true; - } - if (lab == null) - { - return false; - } - for (String label : labs) - { - if (lab.equalsIgnoreCase(label)) - { - return true; - } - } - return false; - } - /** * Sort sequences by feature score or density, optionally restricted by * feature types, feature groups, or alignment start/end positions. @@ -755,13 +804,10 @@ public class AlignmentSorter * get sequence residues overlapping column region * and features for residue positions and specified types */ - // TODO new method findPositions(startCol, endCol)? JAL-2544 - int startResidue = seqs[i].findPosition(startCol); - int endResidue = seqs[i].findPosition(endCol); String[] types = featureTypes == null ? null : featureTypes .toArray(new String[featureTypes.size()]); - List sfs = seqs[i].getFeatures().findFeatures( - startResidue, endResidue, types); + List sfs = seqs[i].findFeatures(startCol + 1, + endCol + 1, types); seqScores[i] = 0; scores[i] = 0.0; @@ -772,18 +818,6 @@ public class AlignmentSorter SequenceFeature sf = it.next(); /* - * double-check feature overlaps columns (JAL-2544) - * (could avoid this with a findPositions(fromCol, toCol) method) - * findIndex returns base 1 column values, startCol/endCol are base 0 - */ - if (seqs[i].findIndex(sf.getBegin()) > endCol + 1 - || seqs[i].findIndex(sf.getEnd()) < startCol + 1) - { - it.remove(); - continue; - } - - /* * accept all features with null or empty group, otherwise * check group is one of the currently visible groups */