JAL-2629 partial refactoring of Hmmer command classes
[jalview.git] / src / jalview / hmmer / HMMSearchThread.java
index b67ef6f..16c7c68 100644 (file)
@@ -1,14 +1,13 @@
 package jalview.hmmer;
 
-import jalview.bin.Cache;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
 import jalview.datamodel.HiddenMarkovModel;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignFrame;
 import jalview.gui.JvOptionPane;
-import jalview.gui.Preferences;
 import jalview.io.DataSourceType;
 import jalview.io.FileParse;
 import jalview.io.StockholmFile;
@@ -17,31 +16,33 @@ import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
 import jalview.ws.params.ArgumentI;
 import jalview.ws.params.simple.BooleanOption;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Scanner;
 
 import javax.swing.JOptionPane;
 
-public class HMMSearchThread implements Runnable
+public class HMMSearchThread extends HmmerCommand implements Runnable
 {
-  /**
+  static final String HMMSEARCH = "hmmsearch";
+
+  /*
    * feature settings from view that job was associated with
    */
   protected FeatureRendererSettings featureSettings = null;
 
-  /**
-   * Object containing frequently used commands.
-   */
-  HMMERCommands cmds = new HMMERCommands();
+  HiddenMarkovModel hmm;
 
-  AlignFrame af;
+  boolean newFrame;
 
-  HiddenMarkovModel hmm;
+  boolean realign = false;
 
-  boolean newFrame, realign = false, trim = false;
+  boolean trim = false;
 
   Integer numberOfSequences = null;
 
@@ -59,11 +60,8 @@ public class HMMSearchThread implements Runnable
 
   File databaseFile = null;
 
-
-
   SequenceI[] seqs;
 
-
   /**
    * Constructor for the HMMSearchThread. If create new frame is set to true, a
    * new frame will be created.
@@ -103,7 +101,6 @@ public class HMMSearchThread implements Runnable
     barID = System.currentTimeMillis();
     af.setProgressBar(MessageManager.getString("status.running_hmmsearch"),
             barID);
-    cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
 
     try
     {
@@ -114,7 +111,7 @@ public class HMMSearchThread implements Runnable
     }
     try
     {
-      cmds.exportData(null, null, hmm, hmmTemp.getAbsoluteFile());
+      exportData(null, null, hmm, hmmTemp.getAbsoluteFile(), null);
     } catch (IOException e1)
     {
       e1.printStackTrace();
@@ -141,8 +138,7 @@ public class HMMSearchThread implements Runnable
       e.printStackTrace();
     }
 
-    af.setProgressBar(MessageManager.getString("status.running_hmmsearch"),
-            barID);
+    af.setProgressBar("", barID);
 
   }
 
@@ -170,23 +166,18 @@ public class HMMSearchThread implements Runnable
    */
   private boolean runCommand() throws IOException, InterruptedException
   {
-    Boolean dbFound = false;
-    String dbPath = "";
-    File file = new File(cmds.HMMERFOLDER + "/hmmsearch");
-    if (!file.canExecute())
+    String binaryPath = getCommandRoot(HMMSEARCH);
+    if (binaryPath == null)
     {
-      file = new File(cmds.HMMERFOLDER + "/hmmsearch.exe");
-      {
-        if (!file.canExecute())
-        {
-          return false;
-        }
-      }
+      return false;
     }
 
-    String command = cmds.HMMERFOLDER + "/hmmsearch -o "
+    String command = binaryPath + " -o "
             + inputTableTemp.getAbsolutePath() + " -A "
-            + inputAlignmentTemp.getAbsolutePath() + cmds.SPACE;
+            + inputAlignmentTemp.getAbsolutePath() + SPACE;
+
+    boolean dbFound = false;
+    String dbPath = "";
     if (params != null)
     {
       for (ArgumentI arg : params)
@@ -211,16 +202,16 @@ public class HMMSearchThread implements Runnable
           }
           break;
         case "Sequence E-value Cutoff":
-          command += "--incE " + arg.getValue() + cmds.SPACE;
+          command += "--incE " + arg.getValue() + SPACE;
           break;
         case "Sequence Score Threshold":
-          command += "-incT " + arg.getValue() + cmds.SPACE;
+          command += "-incT " + arg.getValue() + SPACE;
           break;
         case "Domain E-value Threshold":
-          command += "--incdomE " + arg.getValue() + cmds.SPACE;
+          command += "--incdomE " + arg.getValue() + SPACE;
           break;
         case "Domain Score Threshold":
-          command += "--incdomT " + arg.getValue() + cmds.SPACE;
+          command += "--incdomT " + arg.getValue() + SPACE;
           break;
         case "Trim Non-Matching Termini":
           trim = true;
@@ -238,7 +229,7 @@ public class HMMSearchThread implements Runnable
       }
     }
 
-    if (dbFound == false || MessageManager.getString("label.this_alignment")
+    if (!dbFound || MessageManager.getString("label.this_alignment")
             .equals(dbPath))
     {
       AlignmentI alignment = af.getViewport().getAlignment();
@@ -254,9 +245,9 @@ public class HMMSearchThread implements Runnable
       writer.close();
     }
 
-    command += hmmTemp.getAbsolutePath() + cmds.SPACE
+    command += hmmTemp.getAbsolutePath() + SPACE
             + databaseFile.getAbsolutePath();
-    return cmds.runCommand(command);
+    return runCommand(command);
   }
 
   /**
@@ -265,59 +256,66 @@ public class HMMSearchThread implements Runnable
    */
   private void importData() throws IOException, InterruptedException
   {
-    StockholmFile file = new StockholmFile(new FileParse(
-            inputAlignmentTemp.getAbsolutePath(), DataSourceType.FILE));
-    seqs = file.getSeqsAsArray();
-
-    readTable();
-
-    SequenceI[] hmmAndSeqs;
-    if (numberOfSequences != null && numberOfSequences < seqs.length)
-    {
-      hmmAndSeqs = new SequenceI[numberOfSequences + 1];
-    }
-    else
+    BufferedReader br = new BufferedReader(
+            new FileReader(inputAlignmentTemp));
+    try
     {
-      hmmAndSeqs = new SequenceI[seqs.length + 1];
-    }
+      if (br.readLine() == null)
+      {
+        JOptionPane.showMessageDialog(af,
+                MessageManager.getString("label.no_sequences_found"));
+        return;
+      }
+      StockholmFile file = new StockholmFile(new FileParse(
+              inputAlignmentTemp.getAbsolutePath(), DataSourceType.FILE));
+      seqs = file.getSeqsAsArray();
 
-    AlignmentAnnotation[] list = hmmSeq.getAnnotation();
-    for (AlignmentAnnotation annot : list)
-    {
-      if ("HMM".equals(annot.getCalcId()))
+      readTable();
+
+      SequenceI[] hmmAndSeqs;
+      if (numberOfSequences != null && numberOfSequences < seqs.length)
       {
-        hmmSeq.removeAlignmentAnnotation(annot);
+        hmmAndSeqs = new SequenceI[numberOfSequences + 1];
       }
-    }
-    hmmSeq.setHasInfo(false);
-    hmmAndSeqs[0] = hmmSeq;
+      else
+      {
+        hmmAndSeqs = new SequenceI[seqs.length + 1];
+      }
+      hmmAndSeqs[0] = hmmSeq;
 
-    if (numberOfSequences != null && seqs.length > numberOfSequences)
-    {
-      System.arraycopy(seqs, 0, hmmAndSeqs, 1, numberOfSequences);
-    }
-    else
-    {
-      System.arraycopy(seqs, 0, hmmAndSeqs, 1, seqs.length);
-    }
+      if (numberOfSequences != null && seqs.length > numberOfSequences)
+      {
+        System.arraycopy(seqs, 0, hmmAndSeqs, 1, numberOfSequences);
+      }
+      else
+      {
+        System.arraycopy(seqs, 0, hmmAndSeqs, 1, seqs.length);
+      }
 
-    AlignmentI alignment = new Alignment(hmmAndSeqs);
-    AlignFrame frame = new AlignFrame(alignment, 1, 1);
-    frame.setSelectedHMMSequence(hmmSeq);
-    List<ArgumentI> alignArgs = new ArrayList<>();
-    if (trim)
+      AlignmentI alignment = new Alignment(hmmAndSeqs);
+      AlignFrame frame = new AlignFrame(alignment, 1, 1);
+      frame.setSelectedHMMSequence(hmmSeq);
+      List<ArgumentI> alignArgs = new ArrayList<>();
+      if (trim)
+      {
+        alignArgs.add(new BooleanOption(
+                MessageManager.getString("label.trim_termini"),
+                MessageManager.getString("label.trim_termini_desc"), true,
+                true, true, null));
+      }
+      HMMAlignThread hmmalign = new HMMAlignThread(frame, true, alignArgs);
+      hmmalign.hmmalignWaitTillComplete();
+      frame = null;
+      hmmTemp.delete();
+      inputAlignmentTemp.delete();
+      inputTableTemp.delete();
+    } finally
     {
-      alignArgs.add(new BooleanOption(
-              MessageManager.getString("label.trim_termini"),
-              MessageManager.getString("label.trim_termini_desc"), true,
-              true, true, null));
+      if (br != null)
+      {
+        br.close();
+      }
     }
-    HMMAlignThread hmmalign = new HMMAlignThread(frame, true, alignArgs);
-    hmmalign.hmmalignWaitTillComplete();
-    frame = null;
-    hmmTemp.delete();
-    inputAlignmentTemp.delete();
-    inputTableTemp.delete();
   }
 
   /**
@@ -340,38 +338,45 @@ public class HMMSearchThread implements Runnable
 
   }
 
-  public void readTable() throws IOException
+  void readTable() throws IOException
   {
-
-    /*
     BufferedReader br = new BufferedReader(new FileReader(inputTableTemp));
     String line = "";
     while (!line.startsWith("Query:"))
     {
       line = br.readLine();
     }
-    for (int i = 0; i < 4; i++)
+    for (int i = 0; i < 5; i++)
     {
-      br.readLine();
+      line = br.readLine();
     }
-    
-    
+
     int index = 0;
-    while (!"  ------ inclusion threshold ------".equals(line))
+    while (!"  ------ inclusion threshold ------".equals(line)
+            && !"".equals(line))
     {
       Scanner scanner = new Scanner(line);
-    
-      String str = scanner.next();
-      AlignmentAnnotation annots = new AlignmentAnnotation("", "", null);
-      annots.setScore(Double.parseDouble(str));
-      seqs[index].addAlignmentAnnotation(annots);
-    
+
+      String str = scanner.next(); // full sequence eValue score
+      float eValue = Float.parseFloat(str);
+      int seqLength = seqs[index].getLength();
+      Annotation[] annots = new Annotation[seqLength];
+      for (int j = 0; j < seqLength; j++)
+      {
+        annots[j] = new Annotation(eValue);
+      }
+      AlignmentAnnotation annot = new AlignmentAnnotation("E-value",
+              "Score", annots);
+      annot.setScore(Double.parseDouble(str));
+      annot.setSequenceRef(seqs[index]);
+      seqs[index].addAlignmentAnnotation(annot);
+
       scanner.close();
+      line = br.readLine();
+      index++;
     }
-    
-    br.close();
-    */
 
+    br.close();
   }
 
 }