JAL-2629 can now choose number of jackhmmer iterations
[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.DoubleParameter;
13 import jalview.ws.params.simple.FileParameter;
14 import jalview.ws.params.simple.IntegerParameter;
15 import jalview.ws.params.simple.LogarithmicParameter;
16 import jalview.ws.params.simple.Option;
17 import jalview.ws.params.simple.RadioChoiceParameter;
18 import jalview.ws.params.simple.StringParameter;
19
20 import java.io.File;
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Scanner;
26
27 public final class HMMERParamStore implements ParamDatastoreI
28 {
29   private static final String HMMBUILD = "hmmbuild";
30
31   private static final String HMMALIGN = "hmmalign";
32
33   private static final String HMMSEARCH = "hmmsearch";
34
35   private static final String JACKHMMER = "jackhmmer";
36
37   private String name;
38
39   private List<WsParamSetI> presets = new ArrayList<>();
40
41   private AlignmentViewport viewport;
42
43   private HMMERParamStore(String nam, AlignmentViewport av)
44   {
45     this.viewport = av;
46     this.name = nam;
47   }
48
49   public static HMMERParamStore forBuild(AlignmentViewport viewport)
50   {
51     return new HMMERParamStore(HMMBUILD, viewport);
52   }
53
54   public static HMMERParamStore forAlign(AlignmentViewport viewport)
55   {
56     return new HMMERParamStore(HMMALIGN, viewport);
57   }
58
59   public static HMMERParamStore forSearch(AlignmentViewport viewport)
60   {
61     return new HMMERParamStore(HMMSEARCH, viewport);
62   }
63
64   public static HMMERParamStore forJackhmmer(AlignmentViewport viewport)
65   {
66     return new HMMERParamStore(JACKHMMER, viewport);
67   }
68
69   @Override
70   public List<WsParamSetI> getPresets()
71   {
72     return presets;
73   }
74
75   @Override
76   public WsParamSetI getPreset(String nam)
77   {
78     return null;
79   }
80
81   @Override
82   public List<ArgumentI> getServiceParameters()
83   {
84     List<ArgumentI> args = new ArrayList<>();
85     switch (name)
86     {
87     case HMMSEARCH:
88       getHMMSearchParams(args);
89       break;
90     case HMMALIGN:
91       getHMMAlignParams(args);
92       break;
93     case HMMBUILD:
94       getHMMBuildParams(args);
95       break;
96     case JACKHMMER:
97       getJackhmmerParams(args);
98     default:
99     }
100
101     return args;
102   }
103
104   /**
105    * Answers default parameters for hmmsearch, taking into account any
106    * configured as user preferences
107    * 
108    * @param args
109    */
110   private void getHMMSearchParams(List<ArgumentI> args)
111   {
112     /*
113      * 'Options'
114      */
115     args.add(new BooleanOption(
116             MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
117             MessageManager.getString("label.auto_align_seqs_desc"), false,
118             false, false, null));
119     args.add(new BooleanOption(
120             MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
121             MessageManager.getString("label.use_accessions_desc"), false,
122             false, true, null));
123     args.add(new BooleanOption(
124             MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY),
125             MessageManager.getString("label.trim_termini_desc"), false,
126             false, true, null));
127     args.add(new BooleanOption(
128             MessageManager.getString(HMMSearch.RETURN_N_NEW_SEQ),
129             MessageManager.getString("label.check_for_new_sequences_desc"),
130             false, false, false, null));
131
132     /*
133      * 'Parameters'
134      */
135     addChoiceOfHmm(args);
136
137     // addChoiceOfDatabase(args);
138
139     String thisAlignment = MessageManager
140             .getString(HMMSearch.THIS_ALIGNMENT_KEY);
141     String database = MessageManager.getString("label.database");
142     args.add(new FileParameter(database, "", false, "", ""));
143     args.add(new IntegerParameter(
144             MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
145             MessageManager.getString("label.number_of_results_desc"), true,
146             100, 0, 100000));
147     args.add(new RadioChoiceParameter(
148             MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
149             Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
150                     MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
151             MessageManager.getString(HMMSearch.CUTOFF_EVALUE)));
152     args.add(new LogarithmicParameter(
153             MessageManager.getString(HMMSearch.REPORTING_SEQ_EVALUE_KEY),
154             MessageManager.getString("label.reporting_seq_e_value_desc"),
155             false, 1D,
156             1E-100, 10D));
157     args.add(new LogarithmicParameter(
158             MessageManager.getString(HMMSearch.REPORTING_DOM_EVALUE_KEY),
159             MessageManager.getString("label.reporting_dom_e_value_desc"),
160             false, 1D,
161             1E-100, 10D));
162     args.add(
163             new DoubleParameter(
164                     MessageManager
165                             .getString(HMMSearch.REPORTING_SEQ_SCORE_KEY),
166                     MessageManager.getString(
167                             "label.reporting_seq_score_desc"),
168                     false,
169                     0d, 0d, 1000d));
170     args.add(
171             new DoubleParameter(
172                     MessageManager
173                             .getString(HMMSearch.REPORTING_DOM_SCORE_KEY),
174                     MessageManager.getString(
175                             "label.reporting_dom_score_desc"),
176                     false,
177                     0d, 0d, 1000d));
178     args.add(new RadioChoiceParameter(
179             MessageManager.getString(HMMSearch.INCLUSION_THRESHOLD_KEY),
180             null,
181             Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
182                     MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
183             MessageManager.getString(HMMSearch.CUTOFF_EVALUE)));
184     args.add(new LogarithmicParameter(
185             MessageManager.getString(HMMSearch.INCLUSION_SEQ_EVALUE_KEY),
186             MessageManager.getString("label.inclusion_seq_e_value_desc"),
187             false, 1D,
188             1E-100, 10D));
189     args.add(new LogarithmicParameter(
190             MessageManager.getString(HMMSearch.INCLUSION_DOM_EVALUE_KEY),
191             MessageManager.getString("label.inclusion_dom_e_value_desc"),
192             false, 1D,
193             1E-100, 10D));
194     args.add(new DoubleParameter(
195             MessageManager.getString(HMMSearch.INCLUSION_SEQ_SCORE_KEY),
196             MessageManager.getString("label.inclusion_seq_score_desc"),
197             false, 0d, 0d,
198             1000d));
199     args.add(new DoubleParameter(
200             MessageManager.getString(HMMSearch.INCLUSION_DOM_SCORE_KEY),
201             MessageManager.getString("label.inclusion_dom_score_desc"),
202             false, 0d, 0d,
203             1000d));
204   }
205
206   /**
207    * Answers default parameters for jackhmmer, taking into account any configured
208    * as user preferences
209    * 
210    * @param args
211    */
212   private void getJackhmmerParams(List<ArgumentI> args)
213   {
214
215     /*
216      * 'Parameters'
217      */
218     addChoiceOfSequence(args);
219
220     // addChoiceOfDatabase(args);
221
222     String database = MessageManager.getString("label.database");
223     args.add(new FileParameter(database, "", false, "", ""));
224     args.add(new IntegerParameter(
225             MessageManager.getString(HMMSearch.NUMBER_OF_ITERATIONS),
226             MessageManager.getString("label.number_of_iterations_desc"),
227             true, 5, 1, 20));
228     args.add(new RadioChoiceParameter(
229             MessageManager.getString(JackHMMER.REPORTING_CUTOFF_KEY), null,
230             Arrays.asList(MessageManager.getString(JackHMMER.CUTOFF_NONE),
231                     MessageManager.getString(JackHMMER.CUTOFF_EVALUE),
232                     MessageManager.getString(JackHMMER.CUTOFF_SCORE)),
233             MessageManager.getString(JackHMMER.CUTOFF_EVALUE)));
234     args.add(new LogarithmicParameter(
235             MessageManager.getString(JackHMMER.REPORTING_SEQ_EVALUE_KEY),
236             MessageManager.getString("label.reporting_seq_e_value_desc"),
237             false, 1D,
238             1E-38, 10D));
239     args.add(new LogarithmicParameter(
240             MessageManager.getString(JackHMMER.REPORTING_DOM_EVALUE_KEY),
241             MessageManager.getString(
242                     "label.reporting_dom_e_value_desc"),
243             false, 1D,
244             1E-38, 10D));
245     args.add(new DoubleParameter(
246             MessageManager.getString(JackHMMER.REPORTING_SEQ_SCORE_KEY),
247             MessageManager.getString("label.reporting_seq_score_desc"),
248             false, 0d, 0d,
249             1000d));
250     args.add(new DoubleParameter(
251             MessageManager.getString(JackHMMER.REPORTING_DOM_SCORE_KEY),
252             MessageManager.getString("label.reporting_dom_score_desc"),
253             false, 0d, 0d,
254             1000d));
255     args.add(new RadioChoiceParameter(
256             MessageManager.getString(HMMSearch.INCLUSION_THRESHOLD_KEY),
257             null,
258             Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
259                     MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
260             MessageManager.getString(HmmerCommand.CUTOFF_EVALUE)));
261     args.add(new LogarithmicParameter(
262             MessageManager.getString(HMMSearch.INCLUSION_SEQ_EVALUE_KEY),
263             MessageManager.getString("label.inclusion_seq_e_value_desc"),
264             false, 1D, 1E-100, 10D));
265     args.add(new LogarithmicParameter(
266             MessageManager.getString(HMMSearch.INCLUSION_DOM_EVALUE_KEY),
267             MessageManager.getString("label.inclusion_dom_e_value_desc"),
268             false, 1D, 1E-100, 10D));
269     args.add(new DoubleParameter(
270             MessageManager.getString(HMMSearch.INCLUSION_SEQ_SCORE_KEY),
271             MessageManager.getString("label.inclusion_seq_score_desc"),
272             false, 0d, 0d, 1000d));
273     args.add(new DoubleParameter(
274             MessageManager.getString(HMMSearch.INCLUSION_DOM_SCORE_KEY),
275             MessageManager.getString("label.inclusion_dom_score_desc"),
276             false, 0d, 0d, 1000d));
277   }
278
279   /**
280    * Constructs a choice parameter for database to search; always includes 'this
281    * alignment', and also includes any databases held under user preferences key
282    * "HMMSEARCH_DBS" as a comma-delimited list
283    * 
284    * @param args
285    */
286   protected void addChoiceOfDatabase(List<ArgumentI> args)
287   {
288     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
289     if (names == null || names.isEmpty())
290     {
291       return;
292     }
293
294     List<String> filePaths = new ArrayList<>();
295     List<String> fileNames = new ArrayList<>();
296
297     String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
298     filePaths.add(thisAlignment);
299     fileNames.add(thisAlignment);
300
301     Scanner nameScanner = new Scanner(names);
302     nameScanner.useDelimiter(Preferences.COMMA);
303
304     while (nameScanner.hasNext())
305     {
306       String next = nameScanner.next();
307       if ("null".equals(next))
308       {
309         Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
310       }
311       else
312       {
313         filePaths.add(next);
314         int pos = next.lastIndexOf(File.separator);
315         String fileName = next.substring(pos + 1);
316         fileNames.add(fileName);
317       }
318     }
319     nameScanner.close();
320     ArgumentI databasesOption = new StringParameter(
321             MessageManager.getString(HMMSearch.DATABASE_KEY),
322             MessageManager.getString("label.database_for_hmmsearch"), true,
323             thisAlignment,
324             thisAlignment,
325             filePaths, fileNames);
326     args.add(databasesOption);
327   }
328
329   /**
330    * Answers default parameters for hmmalign, taking into account any configured
331    * as user preferences
332    * 
333    * @param args
334    */
335   private void getHMMAlignParams(List<ArgumentI> args)
336   {
337     addChoiceOfHmm(args);
338
339     boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
340             false);
341     args.add(new BooleanOption(
342             MessageManager.getString("label.trim_termini"),
343             MessageManager.getString("label.trim_termini_desc"),
344             false, false, def, null));
345   }
346
347   /**
348    * Adds an argument representing the choice of HMM sequences (profiles)
349    * against which to perform align or search, provided at least one is found
350    * 
351    * @param args
352    */
353   protected void addChoiceOfHmm(List<ArgumentI> args)
354   {
355     List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
356     if (!hmms.isEmpty())
357     {
358       List<String> options = new ArrayList<>();
359       for (SequenceI hmmSeq : hmms)
360       {
361         options.add(hmmSeq.getName());
362       }
363       String defseq = options.get(0);
364       ArgumentI arg = new StringParameter(
365               MessageManager.getString("label.use_hmm"), null, true, defseq,
366               defseq, options, null);
367       args.add(arg);
368     }
369   }
370
371   /**
372    * Adds an argument representing the choice of sequence against which to perform
373    * jackhmmer
374    * 
375    * @param args
376    */
377   protected void addChoiceOfSequence(List<ArgumentI> args)
378   {
379     List<SequenceI> sequences = viewport.getAlignment().getSequences();
380
381     List<String> options = new ArrayList<>();
382
383     for (SequenceI seq : sequences)
384     {
385       options.add(seq.getName());
386     }
387
388     String defseq = options.get(0);
389     ArgumentI arg = new StringParameter(
390             MessageManager.getString("label.use_sequence"), null, true,
391             defseq,
392             defseq, options, null);
393     args.add(arg);
394   }
395
396   /**
397    * Answers default parameters for hmmbuild, taking into account any configured
398    * as user preferences
399    * 
400    * @param args
401    */
402   private void getHMMBuildParams(List<ArgumentI> args)
403   {
404     /*
405      * name to give the computed alignment HMM consensus sequence
406      * (Jalview constructs group HMM consensus sequence names)
407      */
408     String defValue = "Alignment_HMM";
409     StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
410             MessageManager.getString("label.hmm_name_desc"), true, defValue,
411             defValue);
412     args.add(nameParam);
413
414     /*
415      * only enable Use Reference Annotation if RF is present
416      */
417     if (viewport.hasReferenceAnnotation())
418     {
419       args.add(new BooleanOption(
420               MessageManager.getString("label.use_reference"),
421               MessageManager.getString("label.use_reference_desc"), true,
422               true, true, null));
423     }
424
425     /*
426      * choice of whether to compute HMM for alignment and/or group(s)
427      * - only if there are any groups
428      */
429     if (!viewport.getAlignment().getGroups().isEmpty())
430     {
431       List<String> options = new ArrayList<>();
432       options.add(MessageManager.getString("label.alignment"));
433       options.add(MessageManager.getString("label.groups_and_alignment"));
434       options.add(MessageManager.getString("label.groups"));
435       options.add(MessageManager.getString("label.selected_group"));
436       args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
437               MessageManager.getString("label.hmmbuild_for_desc"), true,
438               MessageManager.getString("label.alignment"),
439               MessageManager.getString("label.alignment"), options, null));
440     }
441   }
442
443   @Override
444   public boolean presetExists(String forName)
445   {
446     return false;
447   }
448
449   @Override
450   public void deletePreset(String forName)
451   {
452   }
453
454   @Override
455   public void storePreset(String presetName, String text,
456           List<ArgumentI> jobParams)
457   {
458   }
459
460   @Override
461   public void updatePreset(String oldName, String presetName, String text,
462           List<ArgumentI> jobParams)
463   {
464   }
465
466   @Override
467   public WsParamSetI parseServiceParameterFile(String forName,
468           String description, String[] serviceURL, String parameters)
469           throws IOException
470   {
471     return null;
472   }
473
474   @Override
475   public String generateServiceParameterFile(WsParamSetI pset)
476           throws IOException
477   {
478     return null;
479   }
480
481 }