JAL-1517 update copyright to version 2.8.2
[jalview.git] / src / jalview / ws / rest / params / SeqGroupIndexVector.java
index f02c262..2c4b71a 100644 (file)
@@ -1,20 +1,21 @@
-/*******************************************************************************
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
- * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
- *
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Copyright (C) 2014 The Jalview Authors
+ * 
  * This file is part of Jalview.
- *
+ * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
+ *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
- *
+ * 
  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
- *******************************************************************************/
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.ws.rest.params;
 
 import jalview.datamodel.AlignmentI;
@@ -27,14 +28,11 @@ import jalview.ws.rest.AlignmentProcessor;
 import jalview.ws.rest.InputType;
 import jalview.ws.rest.NoValidInputDataException;
 import jalview.ws.rest.RestJob;
-import jalview.ws.rest.RestServiceDescription;
-import jalview.ws.rest.InputType.molType;
 
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Vector;
 
 import org.apache.http.entity.mime.content.ContentBody;
 import org.apache.http.entity.mime.content.StringBody;
@@ -91,76 +89,62 @@ public class SeqGroupIndexVector extends InputType implements
     // assume that alignment is properly ordered so groups form consecutive
     // blocks
     ArrayList<int[]> gl = new ArrayList<int[]>();
-    int p = 0;
-    for (SequenceGroup sg : (Vector<SequenceGroup>) al.getGroups())
+    int p = 0,lowest=al.getHeight(), highest=0;
+    List<SequenceGroup> sgs;
+    synchronized (sgs = al.getGroups())
     {
-      if (sg.getSize() < minsize)
+      for (SequenceGroup sg : sgs)
       {
-        throw new NoValidInputDataException("Group contains less than "
-                + minsize + " sequences.");
-      }
-      // TODO: refactor to sequenceGroup for efficiency -
-      // getAlignmentRowInterval(AlignmentI al)
-      int[] se = null;
-      for (SequenceI sq : sg.getSequencesInOrder(al))
-      {
-        p = al.findIndex(sq);
-        if (se == null)
+        if (sg.getSize() < minsize)
+        {
+          throw new NoValidInputDataException("Group contains less than "
+                  + minsize + " sequences.");
+        }
+        // TODO: refactor to sequenceGroup for efficiency -
+        // getAlignmentRowInterval(AlignmentI al)
+        int[] se = null;
+        for (SequenceI sq : sg.getSequencesInOrder(al))
         {
-          se = new int[]
-          { p, p };
+          p = al.findIndex(sq);
+          if (lowest>p)
+          {
+            lowest=p;
+          }
+          if (highest<p)
+          {
+            highest=p;
+          }
+          if (se == null)
+          {
+            se = new int[]
+            { p, p };
+          }
+          else
+          {
+            if (p < se[0])
+              se[0] = p;
+            if (p > se[1])
+              se[1] = p;
+          }
         }
-        else
+        if (se != null)
         {
-          if (p < se[0])
-            se[0] = p;
-          if (p > se[1])
-            se[1] = p;
+          gl.add(se);
         }
       }
-      if (se != null)
-      {
-        gl.add(se);
-      }
     }
     // are there any more sequences ungrouped that should be added as a single
     // remaining group ? - these might be at the start or the end
     if (gl.size() > 0)
     {
-      int[] tail = gl.get(0);
-      if (tail[0] > 0)
+      if (lowest-1>minsize)
       {
-        if (1 + tail[0] > minsize)
-        {
-          gl.add(0, new int[]
-          { 0, tail[0] - 1 });
-        }
-        else
-        {
-          // lets be intelligent here - if the remaining sequences aren't enough
-          // to make a final group, then don't make one.
-          // throw new
-          // NoValidInputDataException("Group from remaining ungrouped sequences in input contains less than "+minsize+" sequences.");
-        }
+        gl.add(0, new int[]
+          { 0, lowest-2});
       }
-      else
+      if ((al.getHeight()-1-highest)>minsize)
       {
-        tail = gl.get(gl.size() - 1);
-        if (1 + tail[1] < al.getHeight())
-        {
-          if (al.getHeight() - (1 + tail[1]) > minsize)
-          {
-            gl.add(new int[]
-            { tail[1] + 1, al.getHeight() - 1 });
-          }
-          else
-          {
-            // lets be intelligent here - if the remaining sequences aren't
-            // enough to make a final group, then don't make one.
-            // throw new
-            // NoValidInputDataException("Group from remaining ungrouped sequences in input contains less than "+minsize+" sequences.");
-          }
-        }
+        gl.add(new int[] { highest+1, al.getHeight()-1});
       }
     }
     else
@@ -294,8 +278,11 @@ public class SeqGroupIndexVector extends InputType implements
             "Separator character between elements of vector", true, ",",
             sep, Arrays.asList(new String[]
             { " ", ",", ";", "\t", "|" }), null));
-    lst.add(new IntegerParameter("minsize", "Minimum size of partition allowed by service", true, 1, minsize, 1,0));
-    lst.add(createMolTypeOption("type", "Sequence type", false, type, molType.MIX));
+    lst.add(new IntegerParameter("minsize",
+            "Minimum size of partition allowed by service", true, 1,
+            minsize, 1, 0));
+    lst.add(createMolTypeOption("type", "Sequence type", false, type,
+            molType.MIX));
     return lst;
   }