fix order/reverse order issue for sortByFeature
[jalview.git] / src / jalview / analysis / AlignmentSorter.java
index 9353aab..c4436eb 100755 (executable)
@@ -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,12 @@ 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;
 
@@ -79,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];
@@ -344,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++)
@@ -355,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);
       }
     }
@@ -702,7 +724,7 @@ public class AlignmentSorter
     boolean ignoreScore=method!=FEATURE_SCORE;
     StringBuffer scoreLabel = new StringBuffer();
     scoreLabel.append(start+stop+method);
-    // This doesn't work yet - we'd like to have a canonical ordering that can be preserved from call to call
+    // 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<featureLabels.length; i++)
     {
       scoreLabel.append(featureLabels[i]==null ? "null" : featureLabels[i]);
@@ -834,10 +856,10 @@ public class AlignmentSorter
       {
         if (!hasScore[i])
         {
-          scores[i] = (max + i);
+          scores[i] = (max + 1+i);
         } else {
           int nf=(feats[i]==null) ? 0 :((SequenceFeature[]) feats[i]).length;
-          System.err.println("Sorting on Score: seq "+seqs[i].getName()+ " Feats: "+nf+" Score : "+scores[i]);
+          // System.err.println("Sorting on Score: seq "+seqs[i].getName()+ " Feats: "+nf+" Score : "+scores[i]);
         }
       }
     }
@@ -854,7 +876,7 @@ public class AlignmentSorter
         {
           double nf;
           scores[i] = (0.05+fr*i)+(nf=((feats[i]==null) ? 0.0 :1.0*((SequenceFeature[]) feats[i]).length));
-          System.err.println("Sorting on Density: seq "+seqs[i].getName()+ " Feats: "+nf+" Score : "+scores[i]);
+          // System.err.println("Sorting on Density: seq "+seqs[i].getName()+ " Feats: "+nf+" Score : "+scores[i]);
         }
         jalview.util.QuickSort.sort(scores, seqs);
       }
@@ -864,12 +886,17 @@ public class AlignmentSorter
           throw new Error("Not yet implemented.");
         }
       }
-    if (lastSortByFeatureScore ==null || scoreLabel.equals(lastSortByFeatureScore))
+    if (lastSortByFeatureScore ==null || !scoreLabel.toString().equals(lastSortByFeatureScore))
     {
+      sortByFeatureScoreAscending = true;
+    } else {
+      sortByFeatureScoreAscending = !sortByFeatureScoreAscending;
+    }
+    if (sortByFeatureScoreAscending) {
       setOrder(alignment, seqs);
     }
     else
-    {
+    {      
       setReverseOrder(alignment, seqs);
     }
     lastSortByFeatureScore = scoreLabel.toString();