JAL-2629 storage and lifecycle of alignment/group HMM annotations revised
[jalview.git] / src / jalview / hmmer / HMMAlign.java
similarity index 88%
rename from src/jalview/hmmer/HMMAlignThread.java
rename to src/jalview/hmmer/HMMAlign.java
index fdc1c1c..942342c 100644 (file)
@@ -21,32 +21,20 @@ import jalview.ws.params.ArgumentI;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Hashtable;
 import java.util.List;
 
 import javax.swing.JInternalFrame;
 
-public class HMMAlignThread extends HmmerCommand implements Runnable
+public class HMMAlign extends HmmerCommand
 {
   static final String HMMALIGN = "hmmalign";
 
   static final String ARG_TRIM = "--trim";
 
-  /*
-   * feature settings from view that job was associated with
-   */
-  protected FeatureRendererSettings featureSettings = null;
-
-  AlignmentI alignment;
-
-  AlignmentI dataset;
-
-  List<AlignmentOrder> orders;
-
-  AlignmentView msa;
-
-  HiddenMarkovModel hmm;
+  private final AlignmentI dataset;
 
-  SequenceI[][] allResults;
+  private AlignmentView msa;
 
   /**
    * Constructor for the HMMAlignThread
@@ -54,27 +42,30 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
    * @param af
    * @param args
    */
-  public HMMAlignThread(AlignFrame af, List<ArgumentI> args)
+  public HMMAlign(AlignFrame af, List<ArgumentI> args)
   {
     super(af, args);
-    alignment = af.getViewport().getAlignment();
     if (alignment.getDataset() != null)
     {
       dataset = alignment.getDataset();
     }
-    featureSettings = af.getFeatureRenderer().getSettings();
+    else
+    {
+      dataset = null;
+    }
   }
 
   /**
    * Runs the HMMAlignThread: the data on the alignment or group is exported,
    * then the command is executed in the command line and then the data is
    * imported and displayed in a new frame (if true). The command is executed
-   * for each segemtn of the alignment.
+   * for each segment of the alignment. Call this method directly to execute
+   * synchronously, or via start() in a new Thread for asynchronously.
    */
   @Override
   public void run()
   {
-    hmm = af.getSelectedHMM();
+    HiddenMarkovModel hmm = af.getSelectedHMM();
     if (hmm == null)
     {
       System.err.println("Can't run hmmalign as no HMM profile selected");
@@ -88,11 +79,12 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
     SequenceI[][] subAlignments = msa.getVisibleContigs('-');
 
     List<AlignmentOrder> allOrders = new ArrayList<>();
-    allResults = new SequenceI[subAlignments.length][];
+
+    SequenceI[][] allResults = new SequenceI[subAlignments.length][];
     int job = 0;
     for (SequenceI[] seqs : subAlignments)
     {
-      stashSequences(seqs);
+      Hashtable sequencesHash = stashSequences(seqs);
       try
       {
         File modelFile = createTempFile("hmm", ".hmm");
@@ -111,6 +103,7 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
         }
 
         SequenceI[] result = importData(resultFile, allOrders);
+        recoverSequences(sequencesHash, result);
         allResults[job] = result;
         modelFile.delete();
         alignmentFile.delete();
@@ -122,7 +115,7 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
       job++;
     }
 
-    displayResults(allOrders);
+    displayResults(allResults, allOrders);
 
     af.setProgressBar("", msgId);
   }
@@ -189,7 +182,6 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
     SequenceI[] result = file.getSeqsAsArray();
     AlignmentOrder msaorder = new AlignmentOrder(result);
     AlignmentSorter.recoverOrder(result);
-    recoverSequences(result);
     allOrders.add(msaorder);
 
     return result;
@@ -206,9 +198,12 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
   /**
    * Displays the results of all 'jobs' in a new frame
    * 
+   * @param allResults
+   * 
    * @param allOrders
    */
-  private void displayResults(List<AlignmentOrder> allOrders)
+  private void displayResults(SequenceI[][] allResults,
+          List<AlignmentOrder> allOrders)
   {
     AlignmentOrder[] arrOrders = allOrders
             .toArray(new AlignmentOrder[allOrders.size()]);
@@ -242,8 +237,10 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
     AlignFrame alignFrame = new AlignFrame(al, hidden, AlignFrame.DEFAULT_WIDTH,
             AlignFrame.DEFAULT_HEIGHT);
 
+    FeatureRendererSettings featureSettings = af.getFeatureRenderer()
+            .getSettings();
     // initialise with same renderer settings as in parent alignframe.
-    alignFrame.getFeatureRenderer().transferSettings(this.featureSettings);
+    alignFrame.getFeatureRenderer().transferSettings(featureSettings);
 
     addSortByMenuItems(alignFrame, alorders);
 
@@ -345,24 +342,4 @@ public class HMMAlignThread extends HmmerCommand implements Runnable
       }
     }
   }
-
-  /**
-   * Runs hmmalign, and waits for the results to be imported before continuing
-   */
-  public void hmmalignWaitTillComplete()
-  {
-    Thread loader = new Thread(this);
-    loader.start();
-
-    while (loader.isAlive())
-    {
-      try
-      {
-        Thread.sleep(500);
-      } catch (Exception ex)
-      {
-      }
-    }
-
-  }
 }