Merge branch 'develop' into features/mchmmer
[jalview.git] / src / jalview / hmmer / HMMAlignThread.java
index f714153..fadbdb1 100644 (file)
@@ -1,5 +1,7 @@
 package jalview.hmmer;
 
+import jalview.analysis.AlignmentSorter;
+import jalview.analysis.SeqsetUtils;
 import jalview.bin.Cache;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
@@ -11,37 +13,29 @@ import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.JvOptionPane;
-import jalview.gui.Preferences;
 import jalview.gui.SplitFrame;
 import jalview.io.DataSourceType;
 import jalview.io.StockholmFile;
 import jalview.util.MessageManager;
 import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
+import jalview.ws.params.ArgumentI;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 import javax.swing.JInternalFrame;
-import javax.swing.JOptionPane;
 
-public class HMMAlignThread implements Runnable
+public class HMMAlignThread extends HmmerCommand implements Runnable
 {
+  static final String HMMALIGN = "hmmalign";
 
-  /**
+  /*
    * feature settings from view that job was associated with
    */
   protected FeatureRendererSettings featureSettings = null;
 
-  /**
-   * Object containing frequently used commands.
-   */
-  HMMERCommands cmds = new HMMERCommands();
-
-  AlignFrame af;
-
   AlignmentI alignment;
 
   AlignmentI dataset;
@@ -52,12 +46,12 @@ public class HMMAlignThread implements Runnable
 
   HiddenMarkovModel hmm;
 
+  List<ArgumentI> args;
+
   boolean newFrame;
 
   long barID;
 
-  Map<Integer, SequenceI> hmmSeqs;
-
   File hmmTemp = null;
 
   File outTemp = null;
@@ -75,7 +69,8 @@ public class HMMAlignThread implements Runnable
    * @param af
    * @param createNewFrame
    */
-  public HMMAlignThread(AlignFrame af, boolean createNewFrame)
+  public HMMAlignThread(AlignFrame af, boolean createNewFrame,
+          List<ArgumentI> args)
   {
     this.af = af;
     alignment = af.getViewport().getAlignment();
@@ -85,6 +80,7 @@ public class HMMAlignThread implements Runnable
     }
     newFrame = createNewFrame;
     featureSettings = af.getFeatureRenderer().getSettings();
+    this.args = args;
   }
 
   /**
@@ -96,25 +92,12 @@ public class HMMAlignThread implements Runnable
   @Override
   public void run()
   {
-    if (af.getSelectedHMM() == null)
-    {
-      JOptionPane.showMessageDialog(af,
-              MessageManager.getString("warn.no_selected_hmm"));
-      return;
-    }
-    else
-    {
-      hmm = af.getSelectedHMM();
-    }
+
+    hmm = af.getSelectedHMM();
+
     barID = System.currentTimeMillis();
     af.setProgressBar(MessageManager.getString("status.running_hmmalign"),
             barID);
-    cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
-
-    // if (!alignment.isAligned())
-    // {
-    // alignment.padGaps();
-    // }
     prepareAlignment();
     SequenceI[][] subAlignments = msa.getVisibleContigs('-');
     allOrders = new ArrayList<>();
@@ -122,7 +105,7 @@ public class HMMAlignThread implements Runnable
     int job = 0;
     for (SequenceI[] seqs : subAlignments)
     {
-      cmds.uniquifySequences(seqs);
+      uniquifySequences(seqs);
       try
       {
         createTemporaryFiles();
@@ -132,8 +115,8 @@ public class HMMAlignThread implements Runnable
       }
       try
       {
-        cmds.exportData(seqs, outTemp.getAbsoluteFile(), hmm,
-                hmmTemp.getAbsoluteFile());
+        exportData(seqs, outTemp.getAbsoluteFile(), hmm,
+                hmmTemp.getAbsoluteFile(), null);
       } catch (IOException e1)
       {
         e1.printStackTrace();
@@ -164,8 +147,7 @@ public class HMMAlignThread implements Runnable
 
     displayResults(newFrame);
 
-    af.setProgressBar(MessageManager.getString("status.running_hmmalign"),
-            barID);
+    af.setProgressBar("", barID);
 
   }
 
@@ -176,16 +158,22 @@ public class HMMAlignThread implements Runnable
    */
   private void createTemporaryFiles() throws IOException
   {
-    hmmTemp = File.createTempFile("hmm", ".hmm");
-    hmmTemp.deleteOnExit();
-    outTemp = File.createTempFile("output", ".sto");
-    outTemp.deleteOnExit();
+    if (hmmTemp == null)
+    {
+      hmmTemp = File.createTempFile("hmm", ".hmm");
+      hmmTemp.deleteOnExit();
+    }
+    if (outTemp == null)
+    {
+      outTemp = File.createTempFile("output", ".sto");
+      outTemp.deleteOnExit();
+    }
     inputTemp = File.createTempFile("input", ".sto");
     inputTemp.deleteOnExit();
   }
 
   /**
-   * Executes the hmmalign command in the command line.
+   * Executes the hmmalign command in the command line
    * 
    * @return
    * @throws IOException
@@ -193,42 +181,38 @@ public class HMMAlignThread implements Runnable
    */
   private boolean runCommand() throws IOException, InterruptedException
   {
-    File file = new File(cmds.HMMERFOLDER + "/hmmalign");
-    if (!file.canExecute())
-    {
-      file = new File(cmds.HMMERFOLDER + "/hmmalign.exe");
-      {
-        if (!file.canExecute())
-        {
-          return false;
-        }
-      }
+    String binaryPath = getCommandRoot(HMMALIGN);
+    if (binaryPath == null) {
+      return false;
     }
-    String command = cmds.HMMERFOLDER + cmds.HMMALIGN;
+    String command = binaryPath + SPACE;
+    // todo parse version from ./hmmerbuild -h
     String version = Cache.getProperty("HMMER_VERSION");
     if (!"3.1b2".equals(version))
     {
-      command += cmds.ALLCOL;
-    }
-    boolean trim = true;
-    String bool = Cache.getProperty("TRIM_TERMINI");
-    if ("false".equals(bool))
-    {
-      trim = false;
+      // command += ALLCOL; // todo obsolete option?
     }
-    if (trim)
+    if (args != null)
     {
-      command += cmds.TRIM;
+      for (ArgumentI arg : args)
+      {
+        String name = arg.getName();
+        switch (name)
+        {
+        case "Trim Non-Matching Termini":
+          command += "--trim";
+        }
+      }
     }
-    command += " -o " + inputTemp.getAbsolutePath() + cmds.SPACE
-            + hmmTemp.getAbsolutePath() + cmds.SPACE
+    command += " -o " + inputTemp.getAbsolutePath() + SPACE
+            + hmmTemp.getAbsolutePath() + SPACE
             + outTemp.getAbsolutePath();
-    return cmds.runCommand(command);
+    return runCommand(command);
   }
 
   /**
    * Imports the data from the temporary file to which the output of hmmalign is
-   * directed.
+   * directed. this is used for an internal job.
    * 
    * @param index
    *          The index of the 'job' (or region of an alignment).
@@ -242,8 +226,8 @@ public class HMMAlignThread implements Runnable
             DataSourceType.FILE);
     SequenceI[] result = file.getSeqsAsArray();
     AlignmentOrder msaorder = new AlignmentOrder(result);
-    jalview.analysis.AlignmentSorter.recoverOrder(result);
-    jalview.analysis.SeqsetUtils.deuniquify(cmds.hash, result);
+    AlignmentSorter.recoverOrder(result);
+    SeqsetUtils.deuniquify(hash, result);
     allOrders.add(msaorder);
     allResults[index] = result;
     hmmTemp.delete();
@@ -269,8 +253,7 @@ public class HMMAlignThread implements Runnable
   {
     AlignmentOrder[] arrOrders = allOrders
             .toArray(new AlignmentOrder[allOrders.size()]);
-    Object[] newview = msa.getUpdatedView(allResults,
-            arrOrders, '-');
+    Object[] newview = msa.getUpdatedView(allResults, arrOrders, '-');
     SequenceI[] alignment = (SequenceI[]) newview[0];
     HiddenColumns hidden = (HiddenColumns) newview[1];
     Alignment al = new Alignment(alignment);
@@ -410,6 +393,23 @@ public class HMMAlignThread 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)
+      {
+      }
+    }
 
+  }
+}