JAL-2629 fix for addHMMConsensus failing if no HMM sequences found
[jalview.git] / src / jalview / hmmer / HMMERCommands.java
index 71a7d10..913eee8 100644 (file)
@@ -16,6 +16,13 @@ import java.io.PrintWriter;
 import java.util.Hashtable;
 import java.util.List;
 
+/**
+ * Contains multiple commands and methods frequently used to run hmmbuild,
+ * hmmalign and hmmsearch
+ * 
+ * @author TZVanaalten
+ *
+ */
 public class HMMERCommands
 {
   // Path of hmmer binaries directory
@@ -30,12 +37,6 @@ public class HMMERCommands
 
   public final String HMMSEARCH = "/hmmsearch ";
 
-  public String HMMBUFFER;
-
-  public String ALIGNMENTBUFFER;
-
-  public String ALIGNMENTINPUT;
-
   public String OUTPUTALIGNMENT;
 
   public final String NAME = "-n ";
@@ -56,26 +57,39 @@ public class HMMERCommands
 
   List<SequenceI> hmmSeqs;
 
+  /**
+   * Uniquifies the sequences when exporting and stores their details in a
+   * hashtable.
+   * 
+   * @param seqs
+   */
   public void uniquifySequences(SequenceI[] seqs)
   {
     hash = jalview.analysis.SeqsetUtils.uniquify(seqs, true);
   }
 
+  /**
+   * Recover the sequence data lost by uniquifying.
+   * 
+   * @param seqs
+   */
   public void recoverSequenceNames(SequenceI[] seqs)
   {
     jalview.analysis.SeqsetUtils.deuniquify(hash, seqs);
   }
 
   /**
-   * Runs a command in the terminal.
+   * Runs a command in the command line.
    * 
    * @param command
    * @throws IOException
    * @throws InterruptedException
    */
-  public void runCommand(String command)
+  public boolean runCommand(String command)
           throws IOException, InterruptedException
   {
+    try
+    {
     final Process p = Runtime.getRuntime().exec(command);
 
     new Thread(new Runnable()
@@ -101,10 +115,16 @@ public class HMMERCommands
     }).start();
 
     p.waitFor();
+    } catch (Exception e)
+    {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
   }
 
   /**
-   * Exports an alignment to the buffer location in Jalview.
+   * Exports an alignment and/or HMM to the specified file.
    * 
    * @param alignment
    * @throws IOException
@@ -116,8 +136,7 @@ public class HMMERCommands
     if (seqs != null)
     {
       StockholmFile file = new StockholmFile(new Alignment(seqs));
-      file.setSeqs(seqs);
-      String output = file.print();
+      String output = file.print(seqs, false);
       PrintWriter writer = new PrintWriter(stoLocation);
       writer.println(output);
       writer.close();
@@ -126,13 +145,25 @@ public class HMMERCommands
     if (hmm != null)
     {
       HMMFile file = new HMMFile(hmm);
-      file.exportFile(hmmLocation);
+      PrintWriter writer = new PrintWriter(hmmLocation);
+      writer.print(file.print());
+      writer.close();
     }
   }
 
+  /**
+   * Adds any HMM sequences removed before submitting the alignment as a job
+   * back into the alignment.
+   * 
+   * @param af
+   */
   public void addHMMConsensusSequences(AlignFrame af)
   {
     AlignmentI al = af.getViewport().getAlignment();
+    if (hmmSeqs == null || hmmSeqs.size() < 1)
+    {
+      return;
+    }
     for (SequenceI seq : hmmSeqs)
     {
       Integer position = seq.getPreviousPosition();
@@ -142,13 +173,24 @@ public class HMMERCommands
     af.alignPanel.adjustAnnotationHeight();
     af.getViewport().updateSequenceIdColours();
     af.buildSortByAnnotationScoresMenu();
+    af.getViewport().initInformation();
   }
 
+  /**
+   * Returns the list of HMM sequences removed
+   * 
+   * @return
+   */
   public List<SequenceI> getHmmSeqs()
   {
     return hmmSeqs;
   }
 
+  /**
+   * Sets the list of removed HMM sequences
+   * 
+   * @param hmmSeqs
+   */
   public void setHmmSeqs(List<SequenceI> hmmSeqs)
   {
     this.hmmSeqs = hmmSeqs;