moved visible sub-alignment extraction and update from MsaWSThread to
[jalview.git] / src / jalview / ws / MsaWSThread.java
index 62f076a..c38f901 100644 (file)
@@ -321,88 +321,27 @@ class MsaWSThread
     OutputHeader = wsInfo.getProgressText();
     alTitle = title;
     dataset = seqset;
-    SeqCigar[] msa = _msa.getSequences();
-    int[] contigs = _msa.getContigs();
-    int njobs = 1;
-    if (contigs != null && contigs.length > 0)
+    SequenceI[][] conmsa = _msa.getVisibleContigs('-');
+    if (conmsa != null)
     {
-      int start = 0;
-      njobs = 0;
-      int width = _msa.getWidth();
-      for (int contig = 0; contig < contigs.length; contig += 3)
-      {
-        if ( (contigs[contig + 1] - start) > 0)
-        {
-          njobs++;
-        }
-        width += contigs[contig + 2]; // end up with full region width (including hidden regions)
-        start = contigs[contig + 1] + contigs[contig + 2];
-      }
-      if (start < width)
-      {
-        njobs++;
-      }
+      int njobs = conmsa.length;
       jobs = new MsaWSJob[njobs];
-      start = 0;
-      int j = 0;
-      for (int contig = 0; contig < contigs.length; contig += 3)
+      for (int j = 0; j < njobs; j++)
       {
-        if (contigs[contig + 1] - start > 0)
-        {
-          SequenceI mseq[] = new SequenceI[msa.length];
-          for (int s = 0; s < mseq.length; s++)
-          {
-            mseq[s] = msa[s].getSeq('-').getSubSequence(start,
-                contigs[contig + 1]);
-          }
-          if (j != 0)
-          {
-            jobs[j] = new MsaWSJob(wsinfo.addJobPane(), mseq);
-          }
-          else
-          {
-            jobs[j] = new MsaWSJob(0, mseq);
-          }
-          wsinfo.setProgressName("region " + jobs[j].jobnum, jobs[j].jobnum);
-          wsinfo.setProgressText(jobs[j].jobnum, OutputHeader);
-          j++;
-        }
-        start = contigs[contig + 1] + contigs[contig + 2];
-      }
-      if (start < width)
-      {
-        SequenceI mseq[] = new SequenceI[msa.length];
-        for (int s = 0; s < mseq.length; s++)
-        {
-          mseq[s] = msa[s].getSeq('-').getSubSequence(start,
-              width + 1);
-        }
         if (j != 0)
         {
-          jobs[j] = new MsaWSJob(wsinfo.addJobPane(), mseq);
+          jobs[j] = new MsaWSJob(wsinfo.addJobPane(), conmsa[j]);
         }
         else
         {
-          jobs[j] = new MsaWSJob(0, mseq);
+          jobs[j] = new MsaWSJob(0, conmsa[j]);
         }
-        wsinfo.setProgressName("region " + jobs[j].jobnum, jobs[j].jobnum);
+        if (njobs > 0)
+          wsinfo.setProgressName("region " + jobs[j].jobnum, jobs[j].jobnum);
         wsinfo.setProgressText(jobs[j].jobnum, OutputHeader);
-        j++;
-      }
-    }
-    else
-    {
-      SequenceI mseq[] = new SequenceI[msa.length];
-      for (int s = 0; s < mseq.length; s++)
-      {
-        mseq[s] = msa[s].getSeq('-');
       }
-      jobs = new MsaWSJob[1];
-      wsinfo.setProgressText(OutputHeader); // ensures default text
-      jobs[0] = new MsaWSJob(0, mseq);
     }
   }
-
   public boolean isCancellable()
   {
     return true;
@@ -629,198 +568,37 @@ class MsaWSThread
   void displayResults(boolean newFrame)
   {
     // view input or result data for each block
-    // warn user if a block is input rather than aligned data ?
-
-    int contigs[] = input.getContigs();
-    SeqCigar[] seqs = input.getSequences();
-    SequenceI[] alignment = new SequenceI[seqs.length];
-    ColumnSelection columnselection = new ColumnSelection();
     Vector alorders = new Vector();
-    if (contigs != null && contigs.length > 0)
-    {
-      int start = 0;
-      int nwidth = 0;
-      int owidth = input.getWidth();
-      int j = 0;
-      for (int contig = 0; contig < contigs.length; contig += 3)
-      {
-        owidth += contigs[contig + 2]; // recover final column width
-        if (contigs[contig + 1] - start > 0)
-        {
-          int width = 0; // subalignment width
-          if (jobs[j].hasResults())
-          {
-            Object[] subalg = ((MsaWSJob) jobs[j++]).getAlignment();
-            alorders.add(subalg[1]);
-            SequenceI mseq[] = (SequenceI[]) subalg[0];
-            width = mseq[0].getLength();
-            for (int s = 0; s < mseq.length; s++)
-            {
-              if (alignment[s] == null)
-              {
-                alignment[s] = mseq[s];
-              }
-              else
-              {
-                alignment[s].setSequence(alignment[s].getSequence() +
-                                         mseq[s].getSequence());
-                if (mseq[s].getStart() <= mseq[s].getEnd())
-                {
-                  alignment[s].setEnd(mseq[s].getEnd());
-                }
-                ( (AlignmentOrder) subalg[1]).updateSequence(mseq[s],
-                    alignment[s]);
-              }
-            }
-          }
-          else
-          {
-            // recover input data or place gaps
-            if (true)
-            {
-              // recover input data
-              for (int s = 0; s < seqs.length; s++)
-              {
-                SequenceI oseq = seqs[s].getSeq('-').getSubSequence(start,
-                    contigs[contig + 1]);
-                if (width < oseq.getLength())
-                {
-                  width = oseq.getLength();
-                }
-                if (alignment[s] == null)
-                {
-                  alignment[s] = oseq;
-                }
-                else
-                {
-                  alignment[s].setSequence(alignment[s].getSequence() +
-                                           oseq.getSequence());
-                  if (oseq.getEnd() >= oseq.getStart())
-                  {
-                    alignment[s].setEnd(oseq.getEnd());
-                  }
-                }
-              }
-
-            }
-            j++;
-          }
-          nwidth += width;
-        }
-        // advance to begining of visible region
-        start = contigs[contig + 1] + contigs[contig + 2];
-        // add hidden segment to right of next region
-        for (int s = 0; s < seqs.length; s++)
-        {
-          SequenceI hseq = seqs[s].getSeq('-').getSubSequence(contigs[contig +
-              1], start);
-          if (alignment[s] == null)
-          {
-            alignment[s] = hseq;
-          }
-          else
-          {
-            alignment[s].setSequence(alignment[s].getSequence() +
-                                     hseq.getSequence());
-            if (hseq.getEnd() >= hseq.getStart())
-            {
-              alignment[s].setEnd(hseq.getEnd());
-            }
-          }
-        }
-        // mark hidden segment as hidden in the new alignment
-        columnselection.hideColumns(nwidth, nwidth + contigs[contig + 2] - 1);
-        nwidth += contigs[contig + 2];
-      }
-      // Do final job - if it exists
-      if (j < jobs.length)
-      {
-        int width = 0;
-        if (jobs[j].hasResults())
-        {
-          Object[] subalg = ((MsaWSJob) jobs[j]).getAlignment();
-          alorders.add(subalg[1]);
-          SequenceI mseq[] = (SequenceI[]) subalg[0];
-          width = mseq[0].getLength();
-          for (int s = 0; s < mseq.length; s++)
-          {
-            if (alignment[s] == null)
-            {
-              alignment[s] = mseq[s];
-            }
-            else
-            {
-              alignment[s].setSequence(alignment[s].getSequence() +
-                                       mseq[s].getSequence());
-              if (mseq[s].getEnd() >= mseq[s].getStart())
-              {
-                alignment[s].setEnd(mseq[s].getEnd());
-              }
-              ( (AlignmentOrder) subalg[1]).updateSequence(mseq[s], alignment[s]);
-            }
-          }
-        }
-        else
-        {
-          if (start < owidth)
-          {
-            // recover input data or place gaps
-            if (true)
-            {
-              // recover input data
-              for (int s = 0; s < seqs.length; s++)
-              {
-                SequenceI oseq = seqs[s].getSeq('-').getSubSequence(start,
-                    owidth + 1);
-                if (width < oseq.getLength())
-                {
-                  width = oseq.getLength();
-                }
-                if (alignment[s] == null)
-                {
-                  alignment[s] = oseq;
-                }
-                else
-                {
-                  alignment[s].setSequence(alignment[s].getSequence() +
-                                           oseq.getSequence());
-                  if (oseq.getEnd() >= oseq.getStart())
-                  {
-                    alignment[s].setEnd(oseq.getEnd());
-                  }
-                }
-              }
-              nwidth += width;
-            }
-            else
-            {
-              // place gaps.
-              throw new Error("Padding not yet implemented.");
-            }
-          }
-        }
+    SequenceI[][] results=new SequenceI[jobs.length][];
+    AlignmentOrder[] orders = new AlignmentOrder[jobs.length];
+    SequenceI[] first=null;
+    for (int j=0; j<jobs.length; j++) {
+      if (jobs[j].hasResults()) {
+        Object[] res = ( (MsaWSJob) jobs[j]).getAlignment();
+        alorders.add(res[1]);
+        results[j] = (SequenceI[]) res[0];
+        orders[j] = (AlignmentOrder) res[1];
+//    SequenceI[] alignment = input.getUpdated
+      } else {
+        results[j]=null;
       }
     }
-    else
-    {
-      if (jobs[0].hasResults())
-      {
-        Object[] alg = ((MsaWSJob) jobs[0]).getAlignment();
-        alignment = (SequenceI[]) alg[0];
-        alorders.add(alg[1]);
-      }
-      else
-      {
-        alignment = SeqCigar.createAlignmentSequences(seqs, '-',
-            columnselection, null);
-      }
+    Object[] newview = input.getUpdatedView(results, orders, '-');
+    // trash references to original result data
+    for (int j=0; j<jobs.length; j++) {
+      results[j] = null;
+      orders[j] = null;
     }
+    SequenceI[] alignment = (SequenceI[]) newview[0];
+    ColumnSelection columnselection = (ColumnSelection) newview[1];
     Alignment al = new Alignment(alignment);
     if (dataset != null)
     {
       al.setDataset(dataset);
     }
 
+    // JBNote- TODO: warn user if a block is input rather than aligned data ?
+
     if (newFrame)
     {
       AlignFrame af = new AlignFrame(al, columnselection);
@@ -829,6 +607,7 @@ class MsaWSThread
       // found!!<<<
       af.getFeatureRenderer().transferSettings(
           alignFrame.getFeatureRenderer());
+      // update orders
       if (alorders.size() > 0)
       {
         if (alorders.size() == 1)
@@ -890,4 +669,9 @@ class MsaWSThread
 
     }
   }
+
+  public boolean canMergeResults()
+  {
+    return false;
+  }
 }