JAL-2629 add simple jackhmmer functionality
[jalview.git] / src / jalview / hmmer / HMMERParamStore.java
index fbab7a9..f95d738 100644 (file)
@@ -10,15 +10,17 @@ import jalview.ws.params.ParamDatastoreI;
 import jalview.ws.params.WsParamSetI;
 import jalview.ws.params.simple.BooleanOption;
 import jalview.ws.params.simple.DoubleParameter;
+import jalview.ws.params.simple.FileParameter;
 import jalview.ws.params.simple.IntegerParameter;
 import jalview.ws.params.simple.LogarithmicParameter;
 import jalview.ws.params.simple.Option;
+import jalview.ws.params.simple.RadioChoiceParameter;
 import jalview.ws.params.simple.StringParameter;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 import java.util.Scanner;
 
@@ -30,6 +32,8 @@ public final class HMMERParamStore implements ParamDatastoreI
 
   private static final String HMMSEARCH = "hmmsearch";
 
+  private static final String JACKHMMER = "jackhmmer";
+
   private String name;
 
   private List<WsParamSetI> presets = new ArrayList<>();
@@ -57,6 +61,11 @@ public final class HMMERParamStore implements ParamDatastoreI
     return new HMMERParamStore(HMMSEARCH, viewport);
   }
 
+  public static HMMERParamStore forJackhmmer(AlignmentViewport viewport)
+  {
+    return new HMMERParamStore(JACKHMMER, viewport);
+  }
+
   @Override
   public List<WsParamSetI> getPresets()
   {
@@ -84,6 +93,8 @@ public final class HMMERParamStore implements ParamDatastoreI
     case HMMBUILD:
       getHMMBuildParams(args);
       break;
+    case JACKHMMER:
+      getJackhmmerParams(args);
     default:
     }
 
@@ -101,43 +112,10 @@ public final class HMMERParamStore implements ParamDatastoreI
     /*
      * 'Options'
      */
-    addChoiceOfHmm(args);
-
-    String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
-    if (names != null && !names.isEmpty())
-    {
-      List<String> databases = new ArrayList<>();
-      databases.add(MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY));
-      Scanner nameScanner = new Scanner(names);
-
-      if (nameScanner.hasNext())
-      {
-        while (nameScanner.hasNext())
-        {
-          String next = nameScanner.next();
-          if ("null".equals(next))
-          {
-            Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
-            Cache.setProperty(Preferences.HMMSEARCH_DB_PATHS, "");
-          }
-          else
-          {
-            databases.add(next);
-          }
-        }
-      }
-      nameScanner.close();
-      args.add(new StringParameter(
-              MessageManager.getString(HMMSearch.DATABASE_KEY),
-              MessageManager.getString("label.database_for_hmmsearch"),
-              true, MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY),
-              MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY),
-              databases));
-    }
     args.add(new BooleanOption(
             MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
             MessageManager.getString("label.auto_align_seqs_desc"), false,
-            false, true, null));
+            false, false, null));
     args.add(new BooleanOption(
             MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
             MessageManager.getString("label.use_accessions_desc"), false,
@@ -150,15 +128,28 @@ public final class HMMERParamStore implements ParamDatastoreI
     /*
      * 'Parameters'
      */
+    addChoiceOfHmm(args);
+
+    // addChoiceOfDatabase(args);
+
+    String thisAlignment = MessageManager
+            .getString(HMMSearch.THIS_ALIGNMENT_KEY);
+    String database = MessageManager.getString("label.database");
+    args.add(new RadioChoiceParameter(
+            MessageManager.getString("action.search"), null,
+            Arrays.asList(thisAlignment,
+                    database),
+            thisAlignment));
+    args.add(new FileParameter(database, "", false, "", ""));
     args.add(new IntegerParameter(
             MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
             MessageManager.getString("label.number_of_results_desc"), true,
             100, 0, 100000));
-    args.add(new StringParameter(
+    args.add(new RadioChoiceParameter(
             MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
-            true, HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_NONE,
             Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
-                    HMMSearch.CUTOFF_SCORE)));
+                    HMMSearch.CUTOFF_SCORE),
+            HMMSearch.CUTOFF_EVALUE));
     args.add(new LogarithmicParameter(
             MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
             MessageManager.getString("label.seq_e_value_desc"), false, 1D,
@@ -180,6 +171,102 @@ public final class HMMERParamStore implements ParamDatastoreI
   }
 
   /**
+   * Answers default parameters for jackhmmer, taking into account any configured
+   * as user preferences
+   * 
+   * @param args
+   */
+  private void getJackhmmerParams(List<ArgumentI> args)
+  {
+
+    /*
+     * 'Parameters'
+     */
+    addChoiceOfSequence(args);
+
+    // addChoiceOfDatabase(args);
+
+    String thisAlignment = MessageManager
+            .getString(JackHMMER.THIS_ALIGNMENT_KEY);
+    String database = MessageManager.getString("label.database");
+    args.add(new RadioChoiceParameter(
+            MessageManager.getString("action.search"), null,
+            Arrays.asList(thisAlignment, database), thisAlignment));
+    args.add(new FileParameter(database, "", false, "", ""));
+    args.add(new RadioChoiceParameter(
+            MessageManager.getString(JackHMMER.REPORTING_CUTOFF_KEY), null,
+            Arrays.asList(JackHMMER.CUTOFF_NONE, JackHMMER.CUTOFF_EVALUE,
+                    JackHMMER.CUTOFF_SCORE),
+            JackHMMER.CUTOFF_EVALUE));
+    args.add(new LogarithmicParameter(
+            MessageManager.getString(JackHMMER.SEQ_EVALUE_KEY),
+            MessageManager.getString("label.seq_e_value_desc"), false, 1D,
+            1E-38, 10D));
+    args.add(new LogarithmicParameter(
+            MessageManager.getString(JackHMMER.DOM_EVALUE_KEY),
+            MessageManager.getString("label.dom_e_value_desc"), false, 1D,
+            1E-38, 10D));
+    args.add(new DoubleParameter(
+            MessageManager.getString(JackHMMER.SEQ_SCORE_KEY),
+            MessageManager.getString("label.seq_score_desc"), false, 0d, 0d,
+            1000d));
+    args.add(new DoubleParameter(
+            MessageManager.getString(JackHMMER.DOM_SCORE_KEY),
+            MessageManager.getString("label.dom_score_desc"), false, 0d, 0d,
+            1000d));
+  }
+
+  /**
+   * Constructs a choice parameter for database to search; always includes 'this
+   * alignment', and also includes any databases held under user preferences key
+   * "HMMSEARCH_DBS" as a comma-delimited list
+   * 
+   * @param args
+   */
+  protected void addChoiceOfDatabase(List<ArgumentI> args)
+  {
+    String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
+    if (names == null || names.isEmpty())
+    {
+      return;
+    }
+
+    List<String> filePaths = new ArrayList<>();
+    List<String> fileNames = new ArrayList<>();
+
+    String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
+    filePaths.add(thisAlignment);
+    fileNames.add(thisAlignment);
+
+    Scanner nameScanner = new Scanner(names);
+    nameScanner.useDelimiter(Preferences.COMMA);
+
+    while (nameScanner.hasNext())
+    {
+      String next = nameScanner.next();
+      if ("null".equals(next))
+      {
+        Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
+      }
+      else
+      {
+        filePaths.add(next);
+        int pos = next.lastIndexOf(File.separator);
+        String fileName = next.substring(pos + 1);
+        fileNames.add(fileName);
+      }
+    }
+    nameScanner.close();
+    ArgumentI databasesOption = new StringParameter(
+            MessageManager.getString(HMMSearch.DATABASE_KEY),
+            MessageManager.getString("label.database_for_hmmsearch"), true,
+            thisAlignment,
+            thisAlignment,
+            filePaths, fileNames);
+    args.add(databasesOption);
+  }
+
+  /**
    * Answers default parameters for hmmalign, taking into account any configured
    * as user preferences
    * 
@@ -216,12 +303,37 @@ public final class HMMERParamStore implements ParamDatastoreI
       String defseq = options.get(0);
       ArgumentI arg = new StringParameter(
               MessageManager.getString("label.use_hmm"), null, true, defseq,
-              defseq, options);
+              defseq, options, null);
       args.add(arg);
     }
   }
 
   /**
+   * Adds an argument representing the choice of sequence against which to perform
+   * jackhmmer
+   * 
+   * @param args
+   */
+  protected void addChoiceOfSequence(List<ArgumentI> args)
+  {
+    List<SequenceI> sequences = viewport.getAlignment().getSequences();
+
+    List<String> options = new ArrayList<>();
+
+    for (SequenceI seq : sequences)
+    {
+      options.add(seq.getName());
+    }
+
+    String defseq = options.get(0);
+    ArgumentI arg = new StringParameter(
+            MessageManager.getString("label.use_sequence"), null, true,
+            defseq,
+            defseq, options, null);
+    args.add(arg);
+  }
+
+  /**
    * Answers default parameters for hmmbuild, taking into account any configured
    * as user preferences
    * 
@@ -256,7 +368,7 @@ public final class HMMERParamStore implements ParamDatastoreI
      */
     if (!viewport.getAlignment().getGroups().isEmpty())
     {
-      Collection<String> options = new ArrayList<>();
+      List<String> options = new ArrayList<>();
       options.add(MessageManager.getString("label.alignment"));
       options.add(MessageManager.getString("label.groups_and_alignment"));
       options.add(MessageManager.getString("label.groups"));