X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAlignmentSorter.java;h=c4436ebf9721419eba5ced2a4aba4daa725cf14b;hb=12fdd79d25527a93ee20ffa562899ec5b703e4d5;hp=d801ad8b379b4e017b73905d1f85310f20277264;hpb=705e0bc4a3f6ca917e65fecae15c51d87240f49f;p=jalview.git diff --git a/src/jalview/analysis/AlignmentSorter.java b/src/jalview/analysis/AlignmentSorter.java index d801ad8..c4436eb 100755 --- a/src/jalview/analysis/AlignmentSorter.java +++ b/src/jalview/analysis/AlignmentSorter.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) + * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -40,6 +40,10 @@ import jalview.util.*; */ public class AlignmentSorter { + /** + * todo: refactor searches to follow a basic pattern: + * (search property, last search state, current sort direction) + */ static boolean sortIdAscending = true; static int lastGroupHash = 0; @@ -58,11 +62,14 @@ public class AlignmentSorter * last Annotation Label used by sortByScore */ private static String lastSortByScore; - + private static boolean sortByScoreAscending = true; /** * compact representation of last arguments to SortByFeatureScore */ private static String lastSortByFeatureScore; + private static boolean sortByFeatureScoreAscending = true; + + private static boolean sortLengthAscending; /** * Sort by Percentage Identity w.r.t. s @@ -77,6 +84,23 @@ public class AlignmentSorter public static void sortByPID(AlignmentI align, SequenceI s, SequenceI[] tosort) { + sortByPID(align,s,tosort,0,-1); + } + /** + * Sort by Percentage Identity w.r.t. s + * + * @param align + * AlignmentI + * @param s + * SequenceI + * @param tosort + * sequences from align that are to be sorted. + * @param start start column (0 for beginning + * @param end + */ + public static void sortByPID(AlignmentI align, SequenceI s, + SequenceI[] tosort,int start, int end) + { int nSeq = align.getHeight(); float[] scores = new float[nSeq]; @@ -202,6 +226,38 @@ public class AlignmentSorter sortIdAscending = !sortIdAscending; } + /** + * Sorts by sequence length + * + * @param align + * The alignment object to sort + */ + public static void sortByLength(AlignmentI align) + { + int nSeq = align.getHeight(); + + float[] length = new float[nSeq]; + SequenceI[] seqs = new SequenceI[nSeq]; + + for (int i = 0; i < nSeq; i++) + { + seqs[i] = align.getSequenceAt(i); + length[i] = (float) (seqs[i].getEnd()-seqs[i].getStart()); + } + + QuickSort.sort(length, seqs); + + if (sortLengthAscending) + { + setReverseOrder(align, seqs); + } + else + { + setOrder(align, seqs); + } + + sortLengthAscending = !sortLengthAscending; + } /** * Sorts the alignment by size of group.
@@ -310,7 +366,7 @@ public class AlignmentSorter private static SequenceI[] vectorSubsetToArray(Vector tmp, Vector mask) { Vector seqs = new Vector(); - int i; + int i,idx; boolean[] tmask = new boolean[mask.size()]; for (i = 0; i < mask.size(); i++) @@ -321,10 +377,10 @@ public class AlignmentSorter for (i = 0; i < tmp.size(); i++) { Object sq = tmp.elementAt(i); - - if (mask.contains(sq) && tmask[mask.indexOf(sq)]) + idx = mask.indexOf(sq); + if (idx>-1 && tmask[idx]) { - tmask[mask.indexOf(sq)] = false; + tmask[idx] = false; seqs.addElement(sq); } } @@ -668,6 +724,7 @@ public class AlignmentSorter boolean ignoreScore=method!=FEATURE_SCORE; StringBuffer scoreLabel = new StringBuffer(); scoreLabel.append(start+stop+method); + // This doesn't quite work yet - we'd like to have a canonical ordering that can be preserved from call to call for (int i=0;featureLabels!=null && i