JAL-2418 source formatting
[jalview.git] / src / jalview / analysis / AlignmentSorter.java
index 6c46a3e..6b8ea4a 100755 (executable)
@@ -109,8 +109,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);
     }
 
@@ -416,7 +417,8 @@ public class AlignmentSorter
     }
     else
     {
-      setReverseOrder(align, vectorSubsetToArray(tmp, align.getSequences()));
+      setReverseOrder(align,
+              vectorSubsetToArray(tmp, align.getSequences()));
     }
   }
 
@@ -451,12 +453,9 @@ 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");
       }
     }
 
@@ -492,7 +491,8 @@ public class AlignmentSorter
     }
     else
     {
-      setReverseOrder(align, vectorSubsetToArray(tmp, align.getSequences()));
+      setReverseOrder(align,
+              vectorSubsetToArray(tmp, align.getSequences()));
     }
   }
 
@@ -704,11 +704,10 @@ public class AlignmentSorter
           int start, int stop, AlignmentI alignment, String method)
   {
     sortByFeature(
-            featureLabel == null ? null
-                    : Arrays.asList(new String[] { featureLabel }),
-            groupLabel == null ? null : Arrays
-                    .asList(new String[] { groupLabel }), start, stop,
-            alignment, method);
+            featureLabel == null ? null : Arrays.asList(new String[]
+            { featureLabel }),
+            groupLabel == null ? null : Arrays.asList(new String[]
+            { groupLabel }), start, stop, alignment, method);
   }
 
   private static boolean containsIgnoreCase(final String lab,
@@ -739,9 +738,8 @@ public class AlignmentSorter
     if (method != FEATURE_SCORE && method != FEATURE_LABEL
             && method != FEATURE_DENSITY)
     {
-      throw new Error(
-              MessageManager
-                      .getString("error.implementation_error_sortbyfeature"));
+      throw new Error(MessageManager
+              .getString("error.implementation_error_sortbyfeature"));
     }
 
     boolean ignoreScore = method != FEATURE_SCORE;
@@ -811,17 +809,22 @@ public class AlignmentSorter
       for (int f = 0; f < sf.length; f++)
       {
         // filter for selection criteria
-        if (
-        // ignore features outwith alignment start-stop positions.
-        (sf[f].end < sstart || sf[f].begin > sstop) ||
-        // or ignore based on selection criteria
-                (featureLabels != null && !AlignmentSorter
-                        .containsIgnoreCase(sf[f].type, featureLabels))
-                || (groupLabels != null
-                // problem here: we cannot eliminate null feature group features
-                && (sf[f].getFeatureGroup() != null && !AlignmentSorter
-                        .containsIgnoreCase(sf[f].getFeatureGroup(),
-                                groupLabels))))
+        SequenceFeature feature = sf[f];
+
+        /*
+         * 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
+         */
+        boolean noOverlap = seqs[i].findIndex(feature.getBegin()) > stop + 1
+                || seqs[i].findIndex(feature.getEnd()) < start + 1;
+        boolean skipFeatureType = featureLabels != null && !AlignmentSorter
+                .containsIgnoreCase(feature.type, featureLabels);
+        boolean skipFeatureGroup = groupLabels != null
+                && (feature.getFeatureGroup() != null
+                        && !AlignmentSorter.containsIgnoreCase(
+                                feature.getFeatureGroup(), groupLabels));
+        if (noOverlap || skipFeatureType || skipFeatureGroup)
         {
           // forget about this feature
           sf[f] = null;
@@ -830,7 +833,7 @@ public class AlignmentSorter
         else
         {
           // or, also take a look at the scores if necessary.
-          if (!ignoreScore && !Float.isNaN(sf[f].getScore()))
+          if (!ignoreScore && !Float.isNaN(feature.getScore()))
           {
             if (seqScores[i] == 0)
             {
@@ -838,7 +841,7 @@ public class AlignmentSorter
             }
             seqScores[i]++;
             hasScore[i] = true;
-            scores[i] += sf[f].getScore(); // take the first instance of this
+            scores[i] += feature.getScore(); // take the first instance of this
             // score.
           }
         }
@@ -861,8 +864,9 @@ public class AlignmentSorter
           String[] labs = new String[fs.length];
           for (int l = 0; l < labs.length; l++)
           {
-            labs[l] = (fs[l].getDescription() != null ? fs[l]
-                    .getDescription() : fs[l].getType());
+            labs[l] = (fs[l].getDescription() != null
+                    ? fs[l].getDescription()
+                    : fs[l].getType());
           }
           QuickSort.sort(labs, ((Object[]) feats[i]));
         }