JAL-2629 choice of hmm profile now a parameter not a selection, apis simplified
[jalview.git] / src / jalview / hmmer / HMMERParamStore.java
1 package jalview.hmmer;
2
3 import jalview.bin.Cache;
4 import jalview.datamodel.SequenceI;
5 import jalview.gui.Preferences;
6 import jalview.util.MessageManager;
7 import jalview.viewmodel.AlignmentViewport;
8 import jalview.ws.params.ArgumentI;
9 import jalview.ws.params.ParamDatastoreI;
10 import jalview.ws.params.WsParamSetI;
11 import jalview.ws.params.simple.BooleanOption;
12 import jalview.ws.params.simple.IntegerParameter;
13 import jalview.ws.params.simple.LogarithmicParameter;
14 import jalview.ws.params.simple.Option;
15 import jalview.ws.params.simple.StringParameter;
16
17 import java.io.IOException;
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.List;
21 import java.util.Scanner;
22
23 public final class HMMERParamStore implements ParamDatastoreI
24 {
25   private static final String HMMBUILD = "hmmbuild";
26
27   private static final String HMMALIGN = "hmmalign";
28
29   private static final String HMMSEARCH = "hmmsearch";
30
31   private String name;
32
33   private List<WsParamSetI> presets = new ArrayList<>();
34
35   private AlignmentViewport viewport;
36
37   private HMMERParamStore(String nam, AlignmentViewport av)
38   {
39     this.viewport = av;
40     this.name = nam;
41   }
42
43   public static HMMERParamStore forBuild(AlignmentViewport viewport)
44   {
45     return new HMMERParamStore(HMMBUILD, viewport);
46   }
47
48   public static HMMERParamStore forAlign(AlignmentViewport viewport)
49   {
50     return new HMMERParamStore(HMMALIGN, viewport);
51   }
52
53   public static HMMERParamStore forSearch(AlignmentViewport viewport)
54   {
55     return new HMMERParamStore(HMMSEARCH, viewport);
56   }
57
58   @Override
59   public List<WsParamSetI> getPresets()
60   {
61     return presets;
62   }
63
64   @Override
65   public WsParamSetI getPreset(String nam)
66   {
67     return null;
68   }
69
70   @Override
71   public List<ArgumentI> getServiceParameters()
72   {
73     List<ArgumentI> args = new ArrayList<>();
74     switch (name)
75     {
76     case HMMSEARCH:
77       getHMMSearchParams(args);
78       break;
79     case HMMALIGN:
80       getHMMAlignParams(args);
81       break;
82     case HMMBUILD:
83       getHMMBuildParams(args);
84       break;
85     default:
86     }
87
88     return args;
89   }
90
91   /**
92    * Answers default parameters for hmmsearch, taking into account any
93    * configured as user preferences
94    * 
95    * @param args
96    */
97   private void getHMMSearchParams(List<ArgumentI> args)
98   {
99     addChoiceOfHmm(args);
100
101     args.add(new IntegerParameter(
102             MessageManager.getString("label.number_of_results"),
103             MessageManager.getString("label.number_of_results_desc"), true,
104             100, 0, 100000));
105     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
106     if (names != null && !names.isEmpty())
107     {
108       List<String> databases = new ArrayList<>();
109       databases.add(MessageManager.getString("label.this_alignment"));
110       Scanner nameScanner = new Scanner(names);
111
112       if (nameScanner.hasNext())
113       {
114         while (nameScanner.hasNext())
115         {
116           String next = nameScanner.next();
117           if ("null".equals(next))
118           {
119             Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
120             Cache.setProperty(Preferences.HMMSEARCH_DB_PATHS, "");
121           }
122           else
123           {
124             databases.add(next);
125           }
126         }
127       }
128       nameScanner.close();
129       args.add(new Option(MessageManager.getString("label.database"),
130               MessageManager.getString("label.database_for_hmmsearch"),
131               true, MessageManager.getString("label.this_alignment"),
132               MessageManager.getString("label.this_alignment"), databases,
133               null));
134     }
135     args.add(new BooleanOption(
136             MessageManager.getString("label.auto_align_seqs"),
137             MessageManager.getString("label.auto_align_seqs_desc"), false,
138             false, true, null));
139     args.add(new BooleanOption(
140             MessageManager.getString("label.use_accessions"),
141             MessageManager.getString("label.use_accessions_desc"), false,
142             false, true, null));
143     args.add(new BooleanOption(
144             MessageManager.getString("label.trim_termini"),
145             MessageManager.getString("label.trim_termini_desc"), false,
146             false, true, null));
147     args.add(new LogarithmicParameter(
148             MessageManager.getString("label.seq_e_value"),
149             MessageManager.getString("label.seq_e_value_desc"), false, 1D,
150             1E-38, 10D, 10D));
151     /*
152     args.add(new DoubleParameter(
153             MessageManager.getString("label.seq_score"),
154             MessageManager.getString("label.seq_score_desc"), false,
155             0d, 0d, 10000d));
156        */
157     args.add(new LogarithmicParameter(
158             MessageManager.getString("label.dom_e_value"),
159             // MessageManager.getString("label.dom_e_value_desc"), false, -3d,
160             // -37.92977945, 1d, 10d));
161             MessageManager.getString("label.dom_e_value_desc"), false, 1D,
162             1E-38, 10D, 10D));
163     /*
164     args.add(new DoubleParameter(
165             MessageManager.getString("label.dom_score"),
166             MessageManager.getString("label.dom_score_desc"), false, 0d,
167             0d,
168             10000d));
169             */
170   }
171
172   /**
173    * Answers default parameters for hmmalign, taking into account any configured
174    * as user preferences
175    * 
176    * @param args
177    */
178   private void getHMMAlignParams(List<ArgumentI> args)
179   {
180     addChoiceOfHmm(args);
181
182     boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
183             false);
184     args.add(new BooleanOption(
185             MessageManager.getString("label.trim_termini"),
186             MessageManager.getString("label.trim_termini_desc"),
187             false, false, def, null));
188   }
189
190   /**
191    * Adds an argument representing the choice of HMM sequences (profiles)
192    * against which to perform align or search, provided more than one is found
193    * 
194    * @param args
195    */
196   protected void addChoiceOfHmm(List<ArgumentI> args)
197   {
198     List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
199     if (!hmms.isEmpty())
200     {
201       List<String> options = new ArrayList<>();
202       for (SequenceI hmmSeq : hmms)
203       {
204         options.add(hmmSeq.getName());
205       }
206       String defseq = options.get(0);
207       Option option = new Option(MessageManager.getString("label.use_hmm"),
208               "", true, defseq, defseq, options, null);
209       args.add(option);
210     }
211   }
212
213   /**
214    * Answers default parameters for hmmbuild, taking into account any configured
215    * as user preferences
216    * 
217    * @param args
218    */
219   private void getHMMBuildParams(List<ArgumentI> args)
220   {
221     /*
222      * name to give the computed alignment HMM consensus sequence
223      * (Jalview constructs group HMM consensus sequence names)
224      */
225     String defValue = "Alignment_HMM";
226     StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
227             MessageManager.getString("label.hmm_name_desc"), true, defValue,
228             defValue);
229     args.add(nameParam);
230
231     /*
232      * only enable Use Reference Annotation if RF is present
233      */
234     if (viewport.hasReferenceAnnotation())
235     {
236       args.add(new BooleanOption(
237               MessageManager.getString("label.use_reference"),
238               MessageManager.getString("label.use_reference_desc"), true,
239               true, true, null));
240     }
241
242     /*
243      * choice of whether to compute HMM for alignment and/or group(s)
244      */
245     Collection<String> options = new ArrayList<>();
246     options.add(MessageManager.getString("label.alignment"));
247     options.add(MessageManager.getString("label.groups_and_alignment"));
248     options.add(MessageManager.getString("label.groups"));
249     options.add(MessageManager.getString("label.selected_group"));
250     args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
251             MessageManager.getString("label.hmmbuild_for_desc"), true,
252             MessageManager.getString("label.alignment"),
253             MessageManager.getString("label.alignment"), options, null));
254   }
255
256   @Override
257   public boolean presetExists(String forName)
258   {
259     return false;
260   }
261
262   @Override
263   public void deletePreset(String forName)
264   {
265   }
266
267   @Override
268   public void storePreset(String presetName, String text,
269           List<ArgumentI> jobParams)
270   {
271   }
272
273   @Override
274   public void updatePreset(String oldName, String presetName, String text,
275           List<ArgumentI> jobParams)
276   {
277   }
278
279   @Override
280   public WsParamSetI parseServiceParameterFile(String forName,
281           String description, String[] serviceURL, String parameters)
282           throws IOException
283   {
284     return null;
285   }
286
287   @Override
288   public String generateServiceParameterFile(WsParamSetI pset)
289           throws IOException
290   {
291     return null;
292   }
293
294 }