be03ec5371c906587f9dc554b86332a1303030b5
[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 RadioChoiceParameter(
225             MessageManager.getString(JackHMMER.REPORTING_CUTOFF_KEY), null,
226             Arrays.asList(MessageManager.getString(JackHMMER.CUTOFF_NONE),
227                     MessageManager.getString(JackHMMER.CUTOFF_EVALUE),
228                     MessageManager.getString(JackHMMER.CUTOFF_SCORE)),
229             MessageManager.getString(JackHMMER.CUTOFF_EVALUE)));
230     args.add(new LogarithmicParameter(
231             MessageManager.getString(JackHMMER.REPORTING_SEQ_EVALUE_KEY),
232             MessageManager.getString("label.reporting_seq_e_value_desc"),
233             false, 1D,
234             1E-38, 10D));
235     args.add(new LogarithmicParameter(
236             MessageManager.getString(JackHMMER.REPORTING_DOM_EVALUE_KEY),
237             MessageManager.getString(
238                     "label.reporting_dom_e_value_desc"),
239             false, 1D,
240             1E-38, 10D));
241     args.add(new DoubleParameter(
242             MessageManager.getString(JackHMMER.REPORTING_SEQ_SCORE_KEY),
243             MessageManager.getString("label.reporting_seq_score_desc"),
244             false, 0d, 0d,
245             1000d));
246     args.add(new DoubleParameter(
247             MessageManager.getString(JackHMMER.REPORTING_DOM_SCORE_KEY),
248             MessageManager.getString("label.reporting_dom_score_desc"),
249             false, 0d, 0d,
250             1000d));
251     args.add(new RadioChoiceParameter(
252             MessageManager.getString(HMMSearch.INCLUSION_THRESHOLD_KEY),
253             null,
254             Arrays.asList(MessageManager.getString(HMMSearch.CUTOFF_EVALUE),
255                     MessageManager.getString(HMMSearch.CUTOFF_SCORE)),
256             MessageManager.getString(HmmerCommand.CUTOFF_EVALUE)));
257     args.add(new LogarithmicParameter(
258             MessageManager.getString(HMMSearch.INCLUSION_SEQ_EVALUE_KEY),
259             MessageManager.getString("label.inclusion_seq_e_value_desc"),
260             false, 1D, 1E-100, 10D));
261     args.add(new LogarithmicParameter(
262             MessageManager.getString(HMMSearch.INCLUSION_DOM_EVALUE_KEY),
263             MessageManager.getString("label.inclusion_dom_e_value_desc"),
264             false, 1D, 1E-100, 10D));
265     args.add(new DoubleParameter(
266             MessageManager.getString(HMMSearch.INCLUSION_SEQ_SCORE_KEY),
267             MessageManager.getString("label.inclusion_seq_score_desc"),
268             false, 0d, 0d, 1000d));
269     args.add(new DoubleParameter(
270             MessageManager.getString(HMMSearch.INCLUSION_DOM_SCORE_KEY),
271             MessageManager.getString("label.inclusion_dom_score_desc"),
272             false, 0d, 0d, 1000d));
273   }
274
275   /**
276    * Constructs a choice parameter for database to search; always includes 'this
277    * alignment', and also includes any databases held under user preferences key
278    * "HMMSEARCH_DBS" as a comma-delimited list
279    * 
280    * @param args
281    */
282   protected void addChoiceOfDatabase(List<ArgumentI> args)
283   {
284     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
285     if (names == null || names.isEmpty())
286     {
287       return;
288     }
289
290     List<String> filePaths = new ArrayList<>();
291     List<String> fileNames = new ArrayList<>();
292
293     String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
294     filePaths.add(thisAlignment);
295     fileNames.add(thisAlignment);
296
297     Scanner nameScanner = new Scanner(names);
298     nameScanner.useDelimiter(Preferences.COMMA);
299
300     while (nameScanner.hasNext())
301     {
302       String next = nameScanner.next();
303       if ("null".equals(next))
304       {
305         Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
306       }
307       else
308       {
309         filePaths.add(next);
310         int pos = next.lastIndexOf(File.separator);
311         String fileName = next.substring(pos + 1);
312         fileNames.add(fileName);
313       }
314     }
315     nameScanner.close();
316     ArgumentI databasesOption = new StringParameter(
317             MessageManager.getString(HMMSearch.DATABASE_KEY),
318             MessageManager.getString("label.database_for_hmmsearch"), true,
319             thisAlignment,
320             thisAlignment,
321             filePaths, fileNames);
322     args.add(databasesOption);
323   }
324
325   /**
326    * Answers default parameters for hmmalign, taking into account any configured
327    * as user preferences
328    * 
329    * @param args
330    */
331   private void getHMMAlignParams(List<ArgumentI> args)
332   {
333     addChoiceOfHmm(args);
334
335     boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
336             false);
337     args.add(new BooleanOption(
338             MessageManager.getString("label.trim_termini"),
339             MessageManager.getString("label.trim_termini_desc"),
340             false, false, def, null));
341   }
342
343   /**
344    * Adds an argument representing the choice of HMM sequences (profiles)
345    * against which to perform align or search, provided at least one is found
346    * 
347    * @param args
348    */
349   protected void addChoiceOfHmm(List<ArgumentI> args)
350   {
351     List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
352     if (!hmms.isEmpty())
353     {
354       List<String> options = new ArrayList<>();
355       for (SequenceI hmmSeq : hmms)
356       {
357         options.add(hmmSeq.getName());
358       }
359       String defseq = options.get(0);
360       ArgumentI arg = new StringParameter(
361               MessageManager.getString("label.use_hmm"), null, true, defseq,
362               defseq, options, null);
363       args.add(arg);
364     }
365   }
366
367   /**
368    * Adds an argument representing the choice of sequence against which to perform
369    * jackhmmer
370    * 
371    * @param args
372    */
373   protected void addChoiceOfSequence(List<ArgumentI> args)
374   {
375     List<SequenceI> sequences = viewport.getAlignment().getSequences();
376
377     List<String> options = new ArrayList<>();
378
379     for (SequenceI seq : sequences)
380     {
381       options.add(seq.getName());
382     }
383
384     String defseq = options.get(0);
385     ArgumentI arg = new StringParameter(
386             MessageManager.getString("label.use_sequence"), null, true,
387             defseq,
388             defseq, options, null);
389     args.add(arg);
390   }
391
392   /**
393    * Answers default parameters for hmmbuild, taking into account any configured
394    * as user preferences
395    * 
396    * @param args
397    */
398   private void getHMMBuildParams(List<ArgumentI> args)
399   {
400     /*
401      * name to give the computed alignment HMM consensus sequence
402      * (Jalview constructs group HMM consensus sequence names)
403      */
404     String defValue = "Alignment_HMM";
405     StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
406             MessageManager.getString("label.hmm_name_desc"), true, defValue,
407             defValue);
408     args.add(nameParam);
409
410     /*
411      * only enable Use Reference Annotation if RF is present
412      */
413     if (viewport.hasReferenceAnnotation())
414     {
415       args.add(new BooleanOption(
416               MessageManager.getString("label.use_reference"),
417               MessageManager.getString("label.use_reference_desc"), true,
418               true, true, null));
419     }
420
421     /*
422      * choice of whether to compute HMM for alignment and/or group(s)
423      * - only if there are any groups
424      */
425     if (!viewport.getAlignment().getGroups().isEmpty())
426     {
427       List<String> options = new ArrayList<>();
428       options.add(MessageManager.getString("label.alignment"));
429       options.add(MessageManager.getString("label.groups_and_alignment"));
430       options.add(MessageManager.getString("label.groups"));
431       options.add(MessageManager.getString("label.selected_group"));
432       args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
433               MessageManager.getString("label.hmmbuild_for_desc"), true,
434               MessageManager.getString("label.alignment"),
435               MessageManager.getString("label.alignment"), options, null));
436     }
437   }
438
439   @Override
440   public boolean presetExists(String forName)
441   {
442     return false;
443   }
444
445   @Override
446   public void deletePreset(String forName)
447   {
448   }
449
450   @Override
451   public void storePreset(String presetName, String text,
452           List<ArgumentI> jobParams)
453   {
454   }
455
456   @Override
457   public void updatePreset(String oldName, String presetName, String text,
458           List<ArgumentI> jobParams)
459   {
460   }
461
462   @Override
463   public WsParamSetI parseServiceParameterFile(String forName,
464           String description, String[] serviceURL, String parameters)
465           throws IOException
466   {
467     return null;
468   }
469
470   @Override
471   public String generateServiceParameterFile(WsParamSetI pset)
472           throws IOException
473   {
474     return null;
475   }
476
477 }