JAL-2629 hmmsearch now works for different databases
[jalview.git] / src / jalview / hmmer / HMMSearchThread.java
index 0052dc2..b67ef6f 100644 (file)
@@ -15,9 +15,12 @@ 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.File;
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.swing.JOptionPane;
@@ -38,7 +41,9 @@ public class HMMSearchThread implements Runnable
 
   HiddenMarkovModel hmm;
 
-  boolean newFrame;
+  boolean newFrame, realign = false, trim = false;
+
+  Integer numberOfSequences = null;
 
   long barID;
 
@@ -54,6 +59,8 @@ public class HMMSearchThread implements Runnable
 
   File databaseFile = null;
 
+
+
   SequenceI[] seqs;
 
 
@@ -152,7 +159,6 @@ public class HMMSearchThread implements Runnable
     inputAlignmentTemp.deleteOnExit();
     inputTableTemp = File.createTempFile("buffer", ".sto");
     inputTableTemp.deleteOnExit();
-    databaseFile = new File("D:/Thomas/uniref50.fasta");
   }
 
   /**
@@ -164,6 +170,8 @@ 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())
     {
@@ -175,10 +183,78 @@ public class HMMSearchThread implements Runnable
         }
       }
     }
+
     String command = cmds.HMMERFOLDER + "/hmmsearch -o "
             + inputTableTemp.getAbsolutePath() + " -A "
-            + inputAlignmentTemp.getAbsolutePath() + cmds.SPACE
-            + hmmTemp.getAbsolutePath() + cmds.SPACE
+            + inputAlignmentTemp.getAbsolutePath() + cmds.SPACE;
+    if (params != null)
+    {
+      for (ArgumentI arg : params)
+      {
+        String name = arg.getName();
+        switch (name)
+        {
+        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() + cmds.SPACE;
+          break;
+        case "Sequence Score Threshold":
+          command += "-incT " + arg.getValue() + cmds.SPACE;
+          break;
+        case "Domain E-value Threshold":
+          command += "--incdomE " + arg.getValue() + cmds.SPACE;
+          break;
+        case "Domain Score Threshold":
+          command += "--incdomT " + arg.getValue() + cmds.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);
+          }
+        }
+
+      }
+    }
+
+    if (dbFound == false || 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() + cmds.SPACE
             + databaseFile.getAbsolutePath();
     return cmds.runCommand(command);
   }
@@ -195,23 +271,48 @@ public class HMMSearchThread implements Runnable
 
     readTable();
 
-    SequenceI[] hmmAndSeqs = new SequenceI[seqs.length + 1];
+    SequenceI[] hmmAndSeqs;
+    if (numberOfSequences != null && numberOfSequences < seqs.length)
+    {
+      hmmAndSeqs = new SequenceI[numberOfSequences + 1];
+    }
+    else
+    {
+      hmmAndSeqs = new SequenceI[seqs.length + 1];
+    }
+
     AlignmentAnnotation[] list = hmmSeq.getAnnotation();
     for (AlignmentAnnotation annot : list)
     {
-      if ("HMM annotation".equals(annot.getCalcId()))
+      if ("HMM".equals(annot.getCalcId()))
       {
         hmmSeq.removeAlignmentAnnotation(annot);
       }
     }
     hmmSeq.setHasInfo(false);
     hmmAndSeqs[0] = hmmSeq;
-    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);
-    frame.getViewport().initInformation();
-    HMMAlignThread hmmalign = new HMMAlignThread(frame, true);
+    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();