Set job title correctly and pass reason why
[jalview.git] / src / jalview / ws / rest / params / SeqGroupIndexVector.java
index 4e7026e..91b1fff 100644 (file)
@@ -68,6 +68,7 @@ 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())
     {
       if (sg.getSize()<minsize)
@@ -79,7 +80,7 @@ public class SeqGroupIndexVector extends InputType implements
       int[] se = null;
       for (SequenceI sq : sg.getSequencesInOrder(al))
       {
-        int p = al.findIndex(sq);
+        p = al.findIndex(sq);
         if (se == null)
         {
           se = new int[]
@@ -98,6 +99,41 @@ public class SeqGroupIndexVector extends InputType implements
         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 (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.");       
+      }
+      } else {
+        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.");       
+          }
+        }
+      }
+    } else {
+      gl.add(new int[] { 0, al.getHeight()-1});
+    }
+    if (min>=0 && gl.size()<min)
+    {
+      throw new NoValidInputDataException("Not enough sequence groups for input. Need at least "+min+" groups (including ungrouped regions).");
+    }
+    if (max>0 && gl.size()>max)
+    {
+      throw new NoValidInputDataException("Too many sequence groups for input. Need at most "+max+" groups (including ungrouped regions).");
+    }
     int[][] vals = gl.toArray(new int[gl.size()][]);
     int[] srt = new int[gl.size()];
     for (int i = 0; i < vals.length; i++)
@@ -121,4 +157,17 @@ public class SeqGroupIndexVector extends InputType implements
     return new StringBody(idvector.toString());
   }
 
+  /**
+   * set minimum number of sequences allowed in a partition. Default is 1 sequence.
+   * @param i (number greater than 1)
+   */
+  public void setMinsize(int i)
+  {
+    if (minsize>=1)
+      {
+      minsize=i;
+      } else {
+        minsize=1;
+      }
+  }
 }
\ No newline at end of file