JAL-2490 use findFeatures() for efficient feature overlap lookup
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 15 May 2017 08:43:05 +0000 (09:43 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 15 May 2017 08:43:05 +0000 (09:43 +0100)
src/jalview/controller/AlignViewController.java

index bc7f212..84036ab 100644 (file)
@@ -238,85 +238,63 @@ public class AlignViewController implements AlignViewControllerI
     int nseq = 0;
     for (SequenceI sq : seqs)
     {
-      boolean sequenceHasFeature = false;
       if (sq != null)
       {
-        SequenceFeature[] sfs = sq.getSequenceFeatures();
-        if (sfs != null)
+        int ist = sq.findPosition(sqcol.getStartRes());
+        int iend = sq.findPosition(sqcol.getEndRes()); // see JAL-2526
+        List<SequenceFeature> sfs = sq.getFeatures().findFeatures(ist,
+                iend, featureType);
+        if (!sfs.isEmpty())
         {
-          int ist = sq.findIndex(sq.getStart());
-          int iend = sq.findIndex(sq.getEnd());
-          if (iend < startPosition || ist > endPosition)
-          {
-            // sequence not in region
-            continue;
-          }
-          for (SequenceFeature sf : sfs)
+          nseq++;
+        }
+        for (SequenceFeature sf : sfs)
+        {
+          // future functionality - featureType == null means mark columns
+          // containing all displayed features
+          if (sf != null && (featureType.equals(sf.getType())))
           {
-            // future functionality - featureType == null means mark columns
-            // containing all displayed features
-            if (sf != null && (featureType.equals(sf.getType())))
-            {
-              // optimisation - could consider 'spos,apos' like cursor argument
-              // - findIndex wastes time by starting from first character and
-              // counting
-
-              int sfStartCol = sq.findIndex(sf.getBegin());
-              int sfEndCol = sq.findIndex(sf.getEnd());
-
-              if (sf.isContactFeature())
-              {
-                /*
-                 * 'contact' feature - check for 'start' or 'end'
-                 * position within the selected region
-                 */
-                if (sfStartCol >= startPosition
-                        && sfStartCol <= endPosition)
-                {
-                  bs.set(sfStartCol - 1);
-                  sequenceHasFeature = true;
-                }
-                if (sfEndCol >= startPosition && sfEndCol <= endPosition)
-                {
-                  bs.set(sfEndCol - 1);
-                  sequenceHasFeature = true;
-                }
-                continue;
-              }
+            int sfStartCol = sq.findIndex(sf.getBegin());
+            int sfEndCol = sq.findIndex(sf.getEnd()); // inefficient - JAL-2526
 
+            if (sf.isContactFeature())
+            {
               /*
-               * contiguous feature - select feature positions (if any) 
-               * within the selected region
+               * 'contact' feature - check for 'start' or 'end'
+               * position within the selected region
                */
-              if (sfStartCol > endPosition || sfEndCol < startPosition)
-              {
-                // feature is outside selected region
-                continue;
-              }
-              sequenceHasFeature = true;
-              if (sfStartCol < startPosition)
-              {
-                sfStartCol = startPosition;
-              }
-              if (sfStartCol < ist)
+              if (sfStartCol >= startPosition && sfStartCol <= endPosition)
               {
-                sfStartCol = ist;
+                bs.set(sfStartCol - 1);
               }
-              if (sfEndCol > endPosition)
+              if (sfEndCol >= startPosition && sfEndCol <= endPosition)
               {
-                sfEndCol = endPosition;
-              }
-              for (; sfStartCol <= sfEndCol; sfStartCol++)
-              {
-                bs.set(sfStartCol - 1); // convert to base 0
+                bs.set(sfEndCol - 1);
               }
+              continue;
             }
-          }
-        }
 
-        if (sequenceHasFeature)
-        {
-          nseq++;
+            /*
+             * contiguous feature - select feature positions (if any) 
+             * within the selected region
+             */
+            if (sfStartCol < startPosition)
+            {
+              sfStartCol = startPosition;
+            }
+            if (sfStartCol < ist)
+            {
+              sfStartCol = ist;
+            }
+            if (sfEndCol > endPosition)
+            {
+              sfEndCol = endPosition;
+            }
+            for (; sfStartCol <= sfEndCol; sfStartCol++)
+            {
+              bs.set(sfStartCol - 1); // convert to base 0
+            }
+          }
         }
       }
     }