Merge branch 'develop' into update_212_Dec_merge_with_21125_chamges
[jalview.git] / src / jalview / hmmer / HmmerCommand.java
index 79fcb4c..9db0ae1 100644 (file)
@@ -1,7 +1,9 @@
 package jalview.hmmer;
 
 import jalview.analysis.SeqsetUtils;
+import jalview.analysis.SeqsetUtils.SequenceInfo;
 import jalview.bin.Cache;
+import jalview.bin.Console;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
@@ -23,7 +25,6 @@ import jalview.ws.params.ArgumentI;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
@@ -31,6 +32,7 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Base class for hmmbuild, hmmalign and hmmsearch
@@ -61,26 +63,40 @@ public abstract class HmmerCommand implements Runnable
 
   static final String NUMBER_OF_RESULTS_KEY = "label.number_of_results";
 
+  static final String NUMBER_OF_ITERATIONS = "label.number_of_iterations";
+
   static final String TRIM_TERMINI_KEY = "label.trim_termini";
 
+  static final String RETURN_N_NEW_SEQ = "label.check_for_new_sequences";
+
   static final String REPORTING_CUTOFF_KEY = "label.reporting_cutoff";
 
-  static final String CUTOFF_NONE = "None";
+  static final String CUTOFF_NONE = "label.default";
+
+  static final String CUTOFF_SCORE = "label.score";
+
+  static final String CUTOFF_EVALUE = "label.evalue";
 
-  static final String CUTOFF_SCORE = "Score";
+  static final String REPORTING_SEQ_EVALUE_KEY = "label.reporting_seq_evalue";
 
-  static final String CUTOFF_EVALUE = "E-Value";
+  static final String REPORTING_DOM_EVALUE_KEY = "label.reporting_dom_evalue";
 
-  static final String SEQ_EVALUE_KEY = "label.seq_evalue";
+  static final String REPORTING_SEQ_SCORE_KEY = "label.reporting_seq_score";
 
-  static final String DOM_EVALUE_KEY = "label.dom_evalue";
+  static final String REPORTING_DOM_SCORE_KEY = "label.reporting_dom_score";
 
-  static final String SEQ_SCORE_KEY = "label.seq_score";
+  static final String INCLUSION_SEQ_EVALUE_KEY = "label.inclusion_seq_evalue";
 
-  static final String DOM_SCORE_KEY = "label.dom_score";
+  static final String INCLUSION_DOM_EVALUE_KEY = "label.inclusion_dom_evalue";
+
+  static final String INCLUSION_SEQ_SCORE_KEY = "label.inclusion_seq_score";
+
+  static final String INCLUSION_DOM_SCORE_KEY = "label.inclusion_dom_score";
 
   static final String ARG_TRIM = "--trim";
 
+  static final String INCLUSION_THRESHOLD_KEY = "label.inclusion_threshold";
+
   /**
    * Constructor
    * 
@@ -114,7 +130,7 @@ public abstract class HmmerCommand implements Runnable
    * 
    * @param seqs
    */
-  protected Hashtable stashSequences(SequenceI[] seqs)
+  protected Map<String, SequenceInfo> stashSequences(SequenceI[] seqs)
   {
     return SeqsetUtils.uniquify(seqs, true);
   }
@@ -122,12 +138,12 @@ public abstract class HmmerCommand implements Runnable
   /**
    * Restores the sequence data lost by uniquifying
    * 
-   * @param hashtable
+   * @param sequencesHash
    * @param seqs
    */
-  protected void recoverSequences(Hashtable hashtable, SequenceI[] seqs)
+  protected void recoverSequences(Map<String, SequenceInfo> sequencesHash, SequenceI[] seqs)
   {
-    SeqsetUtils.deuniquify(hashtable, seqs);
+    SeqsetUtils.deuniquify(sequencesHash, seqs);
   }
 
   /**
@@ -141,14 +157,14 @@ public abstract class HmmerCommand implements Runnable
   public boolean runCommand(List<String> commands)
           throws IOException
   {
-    List<String> args = Platform.isWindows() ? wrapWithCygwin(commands)
+    List<String> args = Platform.isWindowsAndNotJS() ? wrapWithCygwin(commands)
             : commands;
 
     try
     {
       ProcessBuilder pb = new ProcessBuilder(args);
       pb.redirectErrorStream(true); // merge syserr to sysout
-      if (Platform.isWindows())
+      if (Platform.isWindowsAndNotJS())
       {
         String path = pb.environment().get("Path");
         path = jalview.bin.Cache.getProperty("CYGWIN_PATH") + ";" + path;
@@ -181,8 +197,8 @@ public abstract class HmmerCommand implements Runnable
       int exitValue = p.exitValue();
       if (exitValue != 0)
       {
-        Cache.log.error("Command failed, return code = " + exitValue);
-        Cache.log.error("Command/args were: " + args.toString());
+        Console.error("Command failed, return code = " + exitValue);
+        Console.error("Command/args were: " + args.toString());
       }
       return exitValue == 0; // 0 is success, by convention
     } catch (Exception e)
@@ -205,7 +221,7 @@ public abstract class HmmerCommand implements Runnable
             Cache.getProperty(Preferences.CYGWIN_PATH));
     if (bash == null)
     {
-      Cache.log.error("Cygwin shell not found");
+      Console.error("Cygwin shell not found");
       return commands;
     }
 
@@ -237,13 +253,15 @@ public abstract class HmmerCommand implements Runnable
    * @throws IOException
    */
   public void exportStockholm(SequenceI[] seqs, File toFile,
-          AnnotatedCollectionI annotated) throws IOException
+          AnnotatedCollectionI annotated)
+          throws IOException
   {
     if (seqs == null)
     {
       return;
     }
     AlignmentI newAl = new Alignment(seqs);
+
     if (!newAl.isAligned())
     {
       newAl.padGaps();
@@ -277,6 +295,17 @@ public abstract class HmmerCommand implements Runnable
       }
     }
 
+    for (SequenceI seq : newAl.getSequencesArray())
+    {
+      if (seq.getAnnotation() != null)
+      {
+        for (AlignmentAnnotation ann : seq.getAnnotation())
+        {
+          seq.removeAlignmentAnnotation(ann);
+        }
+      }
+    }
+
     StockholmFile file = new StockholmFile(newAl);
     String output = file.print(seqs, false);
     PrintWriter writer = new PrintWriter(toFile);
@@ -285,30 +314,6 @@ public abstract class HmmerCommand implements Runnable
   }
 
   /**
-   * Exports the given alignment withotu any anotations to a fasta file
-   * 
-   * @param seqs
-   * @param toFile
-   */
-  public void exportFasta(AlignmentI al, File toFile)
-  {
-    FastaFile file = new FastaFile();
-
-    String output = file.print(al.getSequencesArray(), false);
-    PrintWriter writer;
-    try
-    {
-      writer = new PrintWriter(toFile);
-      writer.println(output);
-      writer.close();
-    } catch (FileNotFoundException e)
-    {
-      e.printStackTrace();
-    }
-
-  }
-
-  /**
    * Answers the full path to the given hmmer executable, or null if file cannot
    * be found or is not executable
    * 
@@ -397,8 +402,8 @@ public abstract class HmmerCommand implements Runnable
   }
 
   /**
-   * Answers the HMM profile for the profile sequence the user selected (default
-   * is just the first HMM sequence in the alignment)
+   * Answers the query sequence the user selected (default is just the first
+   * sequence in the alignment)
    * 
    * @return
    */
@@ -434,7 +439,7 @@ public abstract class HmmerCommand implements Runnable
   protected String getFilePath(File resultFile, boolean isInCygwin)
   {
     String path = resultFile.getAbsolutePath();
-    if (Platform.isWindows() && isInCygwin)
+    if (Platform.isWindowsAndNotJS() && isInCygwin)
     {
       // the first backslash escapes '\' for the regular expression argument
       path = path.replaceAll("\\" + File.separator, "/");
@@ -475,4 +480,60 @@ public abstract class HmmerCommand implements Runnable
       }
     }
   }
+
+  /**
+   * Sets the names of any duplicates within the given sequences to include their
+   * respective lengths. Deletes any duplicates that have the same name after this
+   * step
+   * 
+   * @param seqs
+   */
+  void renameDuplicates(AlignmentI al)
+  {
+
+    SequenceI[] seqs = al.getSequencesArray();
+    List<Boolean> wasRenamed = new ArrayList<>();
+
+    for (SequenceI seq : seqs)
+    {
+      wasRenamed.add(false);
+    }
+
+    for (int i = 0; i < seqs.length; i++)
+    {
+      for (int j = 0; j < seqs.length; j++)
+      {
+        if (seqs[i].getName().equals(seqs[j].getName()) && i != j
+                && !wasRenamed.get(j))
+        {
+
+          wasRenamed.set(i, true);
+          String range = "/" + seqs[j].getStart() + "-" + seqs[j].getEnd();
+          // setting sequence name to include range - to differentiate between
+          // sequences of the same name. Currently have to include the range twice
+          // because the range is removed (once) when setting the name
+          // TODO come up with a better way of doing this
+          seqs[j].setName(seqs[j].getName() + range + range);
+        }
+
+      }
+      if (wasRenamed.get(i))
+      {
+        String range = "/" + seqs[i].getStart() + "-" + seqs[i].getEnd();
+        seqs[i].setName(seqs[i].getName() + range + range);
+      }
+    }
+
+    for (int i = 0; i < seqs.length; i++)
+    {
+      for (int j = 0; j < seqs.length; j++)
+      {
+        if (seqs[i].getName().equals(seqs[j].getName()) && i != j)
+        {
+          al.deleteSequence(j);
+        }
+      }
+    }
+  }
+
 }