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