Merge branch 'develop' into features/mchmmer
[jalview.git] / src / jalview / hmmer / HMMSearchThread.java
index 0052dc2..16c7c68 100644 (file)
@@ -1,45 +1,51 @@
 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;
 import jalview.util.MessageManager;
 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();
-
-  AlignFrame af;
-
   HiddenMarkovModel hmm;
 
   boolean newFrame;
 
+  boolean realign = false;
+
+  boolean trim = false;
+
+  Integer numberOfSequences = null;
+
   long barID;
 
   SequenceI hmmSeq;
@@ -56,7 +62,6 @@ public class HMMSearchThread implements Runnable
 
   SequenceI[] seqs;
 
-
   /**
    * Constructor for the HMMSearchThread. If create new frame is set to true, a
    * new frame will be created.
@@ -96,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
     {
@@ -107,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();
@@ -134,8 +138,7 @@ public class HMMSearchThread implements Runnable
       e.printStackTrace();
     }
 
-    af.setProgressBar(MessageManager.getString("status.running_hmmsearch"),
-            barID);
+    af.setProgressBar("", barID);
 
   }
 
@@ -152,7 +155,6 @@ public class HMMSearchThread implements Runnable
     inputAlignmentTemp.deleteOnExit();
     inputTableTemp = File.createTempFile("buffer", ".sto");
     inputTableTemp.deleteOnExit();
-    databaseFile = new File("D:/Thomas/uniref50.fasta");
   }
 
   /**
@@ -164,23 +166,88 @@ public class HMMSearchThread implements Runnable
    */
   private boolean runCommand() throws IOException, InterruptedException
   {
-    File file = new File(cmds.HMMERFOLDER + "/hmmsearch");
-    if (!file.canExecute())
+    String binaryPath = getCommandRoot(HMMSEARCH);
+    if (binaryPath == null)
     {
-      file = new File(cmds.HMMERFOLDER + "/hmmsearch.exe");
+      return false;
+    }
+
+    String command = binaryPath + " -o "
+            + inputTableTemp.getAbsolutePath() + " -A "
+            + inputAlignmentTemp.getAbsolutePath() + SPACE;
+
+    boolean dbFound = false;
+    String dbPath = "";
+    if (params != null)
+    {
+      for (ArgumentI arg : params)
       {
-        if (!file.canExecute())
+        String name = arg.getName();
+        switch (name)
         {
-          return false;
+        case "Number of Results to Return":
+          numberOfSequences = Integer.parseInt(arg.getValue());
+          break;
+        case "Automatically Align Fetched Sequences":
+          if ("Automatically Align Fetched Sequences"
+                  .equals(arg.getValue()))
+          {
+            realign = true;
+          }
+          break;
+        case "Return Accessions":
+          if ("Return Accessions".equals(arg.getValue()))
+          {
+            command += "--acc ";
+          }
+          break;
+        case "Sequence E-value Cutoff":
+          command += "--incE " + arg.getValue() + SPACE;
+          break;
+        case "Sequence Score Threshold":
+          command += "-incT " + arg.getValue() + SPACE;
+          break;
+        case "Domain E-value Threshold":
+          command += "--incdomE " + arg.getValue() + SPACE;
+          break;
+        case "Domain Score Threshold":
+          command += "--incdomT " + arg.getValue() + SPACE;
+          break;
+        case "Trim Non-Matching Termini":
+          trim = true;
+          break;
+        case "Database":
+          dbFound = true;
+          dbPath = arg.getValue();
+          if (!MessageManager.getString("label.this_alignment")
+                  .equals(dbPath))
+          {
+            databaseFile = new File(dbPath);
+          }
         }
+
       }
     }
-    String command = cmds.HMMERFOLDER + "/hmmsearch -o "
-            + inputTableTemp.getAbsolutePath() + " -A "
-            + inputAlignmentTemp.getAbsolutePath() + cmds.SPACE
-            + hmmTemp.getAbsolutePath() + cmds.SPACE
+
+    if (!dbFound || MessageManager.getString("label.this_alignment")
+            .equals(dbPath))
+    {
+      AlignmentI alignment = af.getViewport().getAlignment();
+      AlignmentI copy = new Alignment(alignment);
+      copy.getHMMConsensusSequences(true);
+      StockholmFile stoFile = new StockholmFile(copy);
+      stoFile.setSeqs(copy.getSequencesArray());
+      String alignmentString = stoFile.print();
+      databaseFile = File.createTempFile("database", ".sto");
+      databaseFile.deleteOnExit();
+      PrintWriter writer = new PrintWriter(databaseFile);
+      writer.print(alignmentString);
+      writer.close();
+    }
+
+    command += hmmTemp.getAbsolutePath() + SPACE
             + databaseFile.getAbsolutePath();
-    return cmds.runCommand(command);
+    return runCommand(command);
   }
 
   /**
@@ -189,34 +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();
+    BufferedReader br = new BufferedReader(
+            new FileReader(inputAlignmentTemp));
+    try
+    {
+      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();
+
+      readTable();
 
-    readTable();
+      SequenceI[] hmmAndSeqs;
+      if (numberOfSequences != null && numberOfSequences < seqs.length)
+      {
+        hmmAndSeqs = new SequenceI[numberOfSequences + 1];
+      }
+      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);
+      }
 
-    SequenceI[] hmmAndSeqs = new SequenceI[seqs.length + 1];
-    AlignmentAnnotation[] list = hmmSeq.getAnnotation();
-    for (AlignmentAnnotation annot : list)
+      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
     {
-      if ("HMM annotation".equals(annot.getCalcId()))
+      if (br != null)
       {
-        hmmSeq.removeAlignmentAnnotation(annot);
+        br.close();
       }
     }
-    hmmSeq.setHasInfo(false);
-    hmmAndSeqs[0] = hmmSeq;
-    System.arraycopy(seqs, 0, hmmAndSeqs, 1, seqs.length);
-    AlignmentI alignment = new Alignment(hmmAndSeqs);
-    AlignFrame frame = new AlignFrame(alignment, 1, 1);
-    frame.setSelectedHMMSequence(hmmSeq);
-    frame.getViewport().initInformation();
-    HMMAlignThread hmmalign = new HMMAlignThread(frame, true);
-    hmmalign.hmmalignWaitTillComplete();
-    frame = null;
-    hmmTemp.delete();
-    inputAlignmentTemp.delete();
-    inputTableTemp.delete();
   }
 
   /**
@@ -239,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();
   }
 
 }