JAL-2629 fix for addHMMConsensus failing if no HMM sequences found
[jalview.git] / src / jalview / hmmer / HMMERCommands.java
index 54516b5..913eee8 100644 (file)
@@ -9,53 +9,87 @@ import jalview.io.HMMFile;
 import jalview.io.StockholmFile;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 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
-  static String HMMERFOLDER = "/Documents/";
+  String HMMERFOLDER = "/Documents/";
 
-  static final String JALVIEWDIRECTORY = System.getProperty("user.dir")
+  public String JALVIEWDIRECTORY = System.getProperty("user.dir")
           + "/";
 
-  static String HMMALIGN = "/hmmalign ";
+  public final String HMMALIGN = "/hmmalign ";
 
-  static String HMMBUILD = "/hmmbuild ";
+  public final String HMMBUILD = "/hmmbuild ";
 
-  static String HMMSEARCH = "/hmmsearch ";
+  public final String HMMSEARCH = "/hmmsearch ";
 
-  static final String HMMBUFFER = "src/jalview/hmmer/hmm_buffer.hmm ";
+  public String OUTPUTALIGNMENT;
 
-  static final String ALIGNMENTBUFFER = "src/jalview/hmmer/alignment_buffer.sto ";
+  public final String NAME = "-n ";
 
-  static final String ALIGNMENTINPUT = "src/jalview/hmmer/alignment_input.sto ";
+  public final String SPACE = " ";
 
-  static final String OUTPUTALIGNMENT = "-o " + JALVIEWDIRECTORY
-          + ALIGNMENTINPUT;
+  public final String ALLCOL = "--allcol ";
 
-  static final String NAME = "-n ";
+  public final String TRIM = "--trim ";
 
-  static final String SPACE = " ";
+  public final String FORCEAMINO = "--amino ";
 
-  static final String ALLCOL = "--allcol ";
+  public final String FORCEDNA = "--dna ";
 
-  static final String TRIM = "--trim ";
+  public final String FORCERNA = "--rna ";
 
+  Hashtable hash = new Hashtable();
+
+  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 static void runCommand(String command)
+  public boolean runCommand(String command)
           throws IOException, InterruptedException
   {
+    try
+    {
     final Process p = Runtime.getRuntime().exec(command);
 
     new Thread(new Runnable()
@@ -81,52 +115,84 @@ 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
    */
-  public static void exportData(AlignmentI alignment,
-          boolean exportAlignment, boolean exportHMM, HiddenMarkovModel hmm)
+  public void exportData(SequenceI[] seqs,
+          File stoLocation, HiddenMarkovModel hmm, File hmmLocation)
           throws IOException
   {
-    if (exportAlignment)
+    if (seqs != null)
     {
-      if (!alignment.isAligned())
-      {
-        alignment.padGaps();
-      }
-      List<SequenceI> list = alignment.getSequences();
-      SequenceI[] array = new SequenceI[list.size()];
-      list.toArray(array);
-      StockholmFile file = new StockholmFile(new Alignment(array));
-      file.setSeqs(array);
-      String output = file.print();
-      PrintWriter writer = new PrintWriter(ALIGNMENTBUFFER);
+      StockholmFile file = new StockholmFile(new Alignment(seqs));
+      String output = file.print(seqs, false);
+      PrintWriter writer = new PrintWriter(stoLocation);
       writer.println(output);
       writer.close();
     }
 
-    if (exportHMM)
+    if (hmm != null)
     {
       HMMFile file = new HMMFile(hmm);
-      file.exportFile(HMMBUFFER);
+      PrintWriter writer = new PrintWriter(hmmLocation);
+      writer.print(file.print());
+      writer.close();
     }
   }
 
-  public static void addHMMConsensusSequence(AlignFrame af, SequenceI seq,
-          Integer position)
+  /**
+   * Adds any HMM sequences removed before submitting the alignment as a job
+   * back into the alignment.
+   * 
+   * @param af
+   */
+  public void addHMMConsensusSequences(AlignFrame af)
   {
-    seq.getHMM().initHMMSequence(af, position);
     AlignmentI al = af.getViewport().getAlignment();
+    if (hmmSeqs == null || hmmSeqs.size() < 1)
+    {
+      return;
+    }
+    for (SequenceI seq : hmmSeqs)
+    {
+      Integer position = seq.getPreviousPosition();
+      al.getSequences().add(position, seq);
+    }
     af.getViewport().setAlignment(al);
     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;
+  }
 }