JAL-2629 add hmmbuild validation check which also gets the HMMER version
[jalview.git] / src / jalview / gui / Preferences.java
index 0546264..c8fef96 100755 (executable)
@@ -22,8 +22,14 @@ package jalview.gui;
 
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.bin.Cache;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.HiddenMarkovModel;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceI;
 import jalview.gui.Help.HelpId;
 import jalview.gui.StructureViewer.ViewerType;
+import jalview.hmmer.HMMBuildThread;
 import jalview.io.FileFormatI;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -50,7 +56,6 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.io.File;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Scanner;
@@ -692,11 +697,6 @@ public class Preferences extends GPreferences
     {
       frame.updateHMMERStatus(hmmerStatus);
     }
-    if (hmmerStatus)
-    {
-      // String ver = getHMMERVersion();
-      Cache.setProperty("HMMER_VERSION", "3.1b2");
-    }
     
     
     trimTermini.setSelected(Cache.getDefault("TRIM_TERMINI", false));
@@ -1208,28 +1208,43 @@ public class Preferences extends GPreferences
         }
         return false;
       }
-      if (!canExecute(folder + "/hmmbuild"))
+      AlignmentI alignment = new Alignment(
+              new SequenceI[]
+      { new Sequence("test", "WLWL", 0, 3) });
+      if (canExecute(folder + "/hmmbuild"))
         {
-          message += MessageManager.getString("label.hmmbuild_not_found")
-                  + "\n";
-          missing++;
+        validateHMMBuild(alignment);
         }
+      else
+      {
+        message += MessageManager.getString("label.hmmbuild_not_found")
+                + "\n";
+        missing++;
+      }
 
 
-      if (!canExecute(folder + "/hmmalign"))
+      if (canExecute(folder + "/hmmalign"))
         {
-          message += MessageManager.getString("label.hmmalign_not_found")
-                  + "\n";
-          missing++;
+
         }
+      else
+      {
+        message += MessageManager.getString("label.hmmalign_not_found")
+                + "\n";
+        missing++;
+      }
 
 
-      if (!canExecute(folder + "/hmmsearch"))
+      if (canExecute(folder + "/hmmsearch"))
         {
-          message += MessageManager.getString("label.hmmsearch_not_found")
-                  + "\n";
-          missing++;
+
         }
+      else
+      {
+        message += MessageManager.getString("label.hmmsearch_not_found")
+                + "\n";
+        missing++;
+      }
       }
 
       if (missing > 0)
@@ -1285,28 +1300,51 @@ public class Preferences extends GPreferences
   }
 
   /**
-   * Gets the current version of hmmer
+   * Runs hmmbuild to check if it is working. While doing this it parses the
+   * version of HMMER.
    * 
+   * @param frame
    * @return
    */
-  private String getHMMERVersion()
+  public boolean validateHMMBuild(AlignmentI alignment)
   {
-    File file = new File(hmmerPath.getText() + "/release-notes");
-    Scanner scanner = null;
-    try
+    HMMBuildThread hmmbuild = new HMMBuildThread(alignment);
+    hmmbuild.hmmbuildWaitTillComplete();
+    SequenceI hmmSeq = alignment.getSequenceAt(1);
+    HiddenMarkovModel hmm;
+    if (hmmSeq.isHMMConsensusSequence() && hmmSeq.getHMM() != null)
     {
-      scanner = new Scanner(file);
-    } catch (IOException e)
+      hmm = hmmSeq.getHMM();
+
+      if (hmm.getNumberOfSymbols() < 1)
+      {
+        return false;
+      }
+    }
+    else
     {
-      e.printStackTrace();
-      return null;
+      return false;
     }
-    scanner.next();
-    String res = scanner.next();
-    scanner.close();
-    return res;
+
+    String header = hmm.getFileHeader();
+    if (header == null)
+    {
+      return false;
+    }
+    else
+    {
+      Scanner scanner = new Scanner(header);
+      scanner.next();
+      String string = scanner.next();
+      String version = string.substring(1);
+      Cache.setProperty("HMMER_VERSION", version);
+      scanner.close();
+
+    }
+    return true;
   }
 
+
   private boolean validateHMMERPath()
   {
     return validateHMMERPath(true);