JAL-2629 update spikes/mungo to latest
[jalview.git] / src / jalview / hmmer / HMMERParamStore.java
index c668481..6f1f51f 100644 (file)
@@ -1,8 +1,10 @@
 package jalview.hmmer;
 
 import jalview.bin.Cache;
+import jalview.datamodel.SequenceI;
 import jalview.gui.Preferences;
 import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.params.ArgumentI;
 import jalview.ws.params.ParamDatastoreI;
 import jalview.ws.params.WsParamSetI;
@@ -26,28 +28,31 @@ public final class HMMERParamStore implements ParamDatastoreI
 
   private static final String HMMSEARCH = "hmmsearch";
 
-  String name;
+  private String name;
 
-  List<WsParamSetI> presets = new ArrayList<>();
+  private List<WsParamSetI> presets = new ArrayList<>();
 
-  private HMMERParamStore(String nam)
+  private AlignmentViewport viewport;
+
+  private HMMERParamStore(String nam, AlignmentViewport av)
   {
+    this.viewport = av;
     this.name = nam;
   }
 
-  public static HMMERParamStore forBuild()
+  public static HMMERParamStore forBuild(AlignmentViewport viewport)
   {
-    return new HMMERParamStore(HMMBUILD);
+    return new HMMERParamStore(HMMBUILD, viewport);
   }
 
-  public static HMMERParamStore forAlign()
+  public static HMMERParamStore forAlign(AlignmentViewport viewport)
   {
-    return new HMMERParamStore(HMMALIGN);
+    return new HMMERParamStore(HMMALIGN, viewport);
   }
 
-  public static HMMERParamStore forSearch()
+  public static HMMERParamStore forSearch(AlignmentViewport viewport)
   {
-    return new HMMERParamStore(HMMSEARCH);
+    return new HMMERParamStore(HMMSEARCH, viewport);
   }
 
   @Override
@@ -83,8 +88,16 @@ public final class HMMERParamStore implements ParamDatastoreI
     return args;
   }
 
+  /**
+   * Answers default parameters for hmmsearch, taking into account any
+   * configured as user preferences
+   * 
+   * @param args
+   */
   private void getHMMSearchParams(List<ArgumentI> args)
   {
+    addChoiceOfHmm(args);
+
     args.add(new IntegerParameter(
             MessageManager.getString("label.number_of_results"),
             MessageManager.getString("label.number_of_results_desc"), true,
@@ -92,7 +105,7 @@ public final class HMMERParamStore implements ParamDatastoreI
     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
     if (names != null && !names.isEmpty())
     {
-      Collection<String> databases = new ArrayList<>();
+      List<String> databases = new ArrayList<>();
       databases.add(MessageManager.getString("label.this_alignment"));
       Scanner nameScanner = new Scanner(names);
 
@@ -133,8 +146,8 @@ public final class HMMERParamStore implements ParamDatastoreI
             false, true, null));
     args.add(new LogarithmicParameter(
             MessageManager.getString("label.seq_e_value"),
-            MessageManager.getString("label.seq_e_value_desc"), false, -3d,
-            -37.92977945, 1d, 10d));
+            MessageManager.getString("label.seq_e_value_desc"), false, 1D,
+            1E-38, 10D, 10D));
     /*
     args.add(new DoubleParameter(
             MessageManager.getString("label.seq_score"),
@@ -142,9 +155,9 @@ public final class HMMERParamStore implements ParamDatastoreI
             0d, 0d, 10000d));
        */
     args.add(new LogarithmicParameter(
-            MessageManager.getString("label.dom_e_value_desc"),
-            MessageManager.getString("label.dom_e_value_desc"), false, -3d,
-            -37.92977945, 1d, 10d));
+            MessageManager.getString("label.dom_e_value"),
+            MessageManager.getString("label.dom_e_value_desc"), false, 1D,
+            1E-38, 10D, 10D));
     /*
     args.add(new DoubleParameter(
             MessageManager.getString("label.dom_score"),
@@ -154,30 +167,84 @@ public final class HMMERParamStore implements ParamDatastoreI
             */
   }
 
+  /**
+   * Answers default parameters for hmmalign, taking into account any configured
+   * as user preferences
+   * 
+   * @param args
+   */
   private void getHMMAlignParams(List<ArgumentI> args)
   {
+    addChoiceOfHmm(args);
+
+    boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
+            false);
     args.add(new BooleanOption(
             MessageManager.getString("label.trim_termini"),
             MessageManager.getString("label.trim_termini_desc"),
-            false, false, true, null));
+            false, false, def, null));
+  }
+
+  /**
+   * Adds an argument representing the choice of HMM sequences (profiles)
+   * against which to perform align or search, provided more than one is found
+   * 
+   * @param args
+   */
+  protected void addChoiceOfHmm(List<ArgumentI> args)
+  {
+    List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
+    if (!hmms.isEmpty())
+    {
+      List<String> options = new ArrayList<>();
+      for (SequenceI hmmSeq : hmms)
+      {
+        options.add(hmmSeq.getName());
+      }
+      String defseq = options.get(0);
+      Option option = new Option(MessageManager.getString("label.use_hmm"),
+              "", true, defseq, defseq, options, null);
+      args.add(option);
+    }
   }
 
+  /**
+   * Answers default parameters for hmmbuild, taking into account any configured
+   * as user preferences
+   * 
+   * @param args
+   */
   private void getHMMBuildParams(List<ArgumentI> args)
   {
-    args.add(new StringParameter(MessageManager.getString("label.hmm_name"),
-            MessageManager.getString("label.hmm_name_desc"), true, ""));
-    // todo only enable Use Reference Annotation if RF is present
-    args.add(new BooleanOption(
-            MessageManager.getString("label.use_reference"),
-            MessageManager.getString("label.use_reference_desc"), true,
-            true, true, null));
+    /*
+     * name to give the computed alignment HMM consensus sequence
+     * (Jalview constructs group HMM consensus sequence names)
+     */
+    String defValue = "Alignment_HMM";
+    StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
+            MessageManager.getString("label.hmm_name_desc"), true, defValue,
+            defValue);
+    args.add(nameParam);
 
+    /*
+     * only enable Use Reference Annotation if RF is present
+     */
+    if (viewport.hasReferenceAnnotation())
+    {
+      args.add(new BooleanOption(
+              MessageManager.getString("label.use_reference"),
+              MessageManager.getString("label.use_reference_desc"), true,
+              true, true, null));
+    }
+
+    /*
+     * choice of whether to compute HMM for alignment and/or group(s)
+     */
     Collection<String> options = new ArrayList<>();
     options.add(MessageManager.getString("label.alignment"));
     options.add(MessageManager.getString("label.groups_and_alignment"));
     options.add(MessageManager.getString("label.groups"));
     options.add(MessageManager.getString("label.selected_group"));
-
     args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
             MessageManager.getString("label.hmmbuild_for_desc"), true,
             MessageManager.getString("label.alignment"),