JAL-975 - ensure we only submit ungapped, padded alignment data to AACon - otherwise...
authorjprocter <jprocter@compbio.dundee.ac.uk>
Tue, 19 Jun 2012 10:49:04 +0000 (11:49 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Tue, 19 Jun 2012 10:49:04 +0000 (11:49 +0100)
src/jalview/ws/jws2/AAConsClient.java
src/jalview/ws/jws2/JabawsAlignCalcWorker.java

index 7aaac5b..c76ea1c 100644 (file)
@@ -23,10 +23,11 @@ public class AAConsClient extends JabawsAlignCalcWorker
           WsParamSetI preset, List<Argument> paramset)
   {
     super(service, alignFrame, preset, paramset);
-    submitGaps=true;
-    alignedSeqs=true;
-    nucleotidesAllowed=false;
-    proteinAllowed=true;
+    submitGaps = true;
+    alignedSeqs = true;
+    nucleotidesAllowed = false;
+    proteinAllowed = true;
+    gapMap=new boolean[0];
   }
 
   public String getServiceActionText()
@@ -98,6 +99,14 @@ public class AAConsClient extends JabawsAlignCalcWorker
                     x = val;
                   }
                 }
+                // if we're at a gapped column then skip to next ungapped position
+                if (gapMap != null && gapMap.length > 0)
+                {
+                  while (!gapMap[i])
+                  {
+                    elm[i++]=new Annotation("", "" , ' ', Float.NaN);
+                  }
+                }
                 elm[i] = new Annotation("", "" + val, ' ', val);
               }
 
index 9a1557c..7ef85d3 100644 (file)
@@ -334,10 +334,10 @@ public abstract class JabawsAlignCalcWorker extends AlignCalcWorker
   protected boolean bySequence = false;
 
   Map<String, SequenceI> seqNames;
-
+  boolean[] gapMap;
+  int realw;
   public List<FastaSequence> getInputSequences(AlignmentI alignment)
   {
-
     if (alignment == null || alignment.getWidth() <= 0
             || alignment.getSequences() == null
             // || (alignedSeqs && !alignment.isAligned() && !submitGaps)
@@ -354,9 +354,9 @@ public abstract class JabawsAlignCalcWorker extends AlignCalcWorker
     {
       seqNames = new HashMap<String, SequenceI>();
     }
+    gapMap=new boolean[0];
     for (SequenceI sq : ((List<SequenceI>) alignment.getSequences()))
     {
-
       if (sq.getEnd() - sq.getStart() > minlen - 1)
       {
         String newname = SeqsetUtils.unique_name(seqs.size() + 1);
@@ -366,10 +366,28 @@ public abstract class JabawsAlignCalcWorker extends AlignCalcWorker
           seqNames.put(newname, sq);
         }
         FastaSequence seq;
+        if (submitGaps)
+        {
+          seqs.add(seq = new compbio.data.sequence.FastaSequence(newname,sq.getSequenceAsString()));
+          if (gapMap==null || gapMap.length<seq.getSequence().length())
+          {
+            boolean[] tg=gapMap;
+            gapMap=new boolean[seq.getLength()];
+            System.arraycopy(tg, 0, gapMap, 0, tg.length);
+            for (int p=tg.length;p<gapMap.length;p++)
+            {
+              gapMap[p]=false; // init as a gap
+            }
+          }
+          for (int apos:sq.gapMap()) {
+            gapMap[apos]=true; // aligned.
+          }
+        } else {
         seqs.add(seq = new compbio.data.sequence.FastaSequence(newname,
-                (submitGaps) ? sq.getSequenceAsString() : AlignSeq
+                AlignSeq
                         .extractGaps(jalview.util.Comparison.GapChars,
                                 sq.getSequenceAsString())));
+        }
         if (seq.getSequence().length() > ln)
         {
           ln = seq.getSequence().length();
@@ -378,6 +396,14 @@ public abstract class JabawsAlignCalcWorker extends AlignCalcWorker
     }
     if (alignedSeqs && submitGaps)
     {
+      realw = 0;
+      for (int i=0;i<gapMap.length;i++)
+      {
+        if (gapMap[i])
+        {
+          realw++;
+        }
+      }
       // try real hard to return something submittable
       // TODO: some of AAcons measures need a minimum of two or three amino
       // acids at each position, and aacons doesn't gracefully degrade.
@@ -385,20 +411,23 @@ public abstract class JabawsAlignCalcWorker extends AlignCalcWorker
       {
         FastaSequence sq = seqs.get(p);
         int l = sq.getSequence().length();
-        if (l < ln)
+        // strip gapped columns
+        char[] padded = new char[realw],orig=sq.getSequence().toCharArray();
+        for (int i=0,pp=0;i<realw; pp++)
         {
-          char[] padded = new char[ln];
-          System.arraycopy(sq.getSequence().toCharArray(), 0, padded, 0, sq
-                  .getSequence().length());
-          while (l < ln)
+          if (gapMap[pp])
           {
-            padded[l++] = '-';
+            if (orig.length>pp)
+            {
+              padded[i++]=orig[pp];
+            } else {
+              padded[i++]='-';
+            }       
           }
-          seqs.set(p, new compbio.data.sequence.FastaSequence(sq.getId(),
-                  new String(padded)));
         }
+        seqs.set(p, new compbio.data.sequence.FastaSequence(sq.getId(),
+                  new String(padded)));
       }
-
     }
     return seqs;
   }