f95d738cf564991a89ff8a035d2d6ec06c4df125
[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
128     /*
129      * 'Parameters'
130      */
131     addChoiceOfHmm(args);
132
133     // addChoiceOfDatabase(args);
134
135     String thisAlignment = MessageManager
136             .getString(HMMSearch.THIS_ALIGNMENT_KEY);
137     String database = MessageManager.getString("label.database");
138     args.add(new RadioChoiceParameter(
139             MessageManager.getString("action.search"), null,
140             Arrays.asList(thisAlignment,
141                     database),
142             thisAlignment));
143     args.add(new FileParameter(database, "", false, "", ""));
144     args.add(new IntegerParameter(
145             MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
146             MessageManager.getString("label.number_of_results_desc"), true,
147             100, 0, 100000));
148     args.add(new RadioChoiceParameter(
149             MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
150             Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
151                     HMMSearch.CUTOFF_SCORE),
152             HMMSearch.CUTOFF_EVALUE));
153     args.add(new LogarithmicParameter(
154             MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
155             MessageManager.getString("label.seq_e_value_desc"), false, 1D,
156             1E-38, 10D));
157     args.add(new LogarithmicParameter(
158             MessageManager.getString(HMMSearch.DOM_EVALUE_KEY),
159             MessageManager.getString("label.dom_e_value_desc"), false, 1D,
160             1E-38, 10D));
161     args.add(
162             new DoubleParameter(
163                     MessageManager.getString(HMMSearch.SEQ_SCORE_KEY),
164                     MessageManager.getString("label.seq_score_desc"), false,
165                     0d, 0d, 1000d));
166     args.add(
167             new DoubleParameter(
168                     MessageManager.getString(HMMSearch.DOM_SCORE_KEY),
169                     MessageManager.getString("label.dom_score_desc"), false,
170                     0d, 0d, 1000d));
171   }
172
173   /**
174    * Answers default parameters for jackhmmer, taking into account any configured
175    * as user preferences
176    * 
177    * @param args
178    */
179   private void getJackhmmerParams(List<ArgumentI> args)
180   {
181
182     /*
183      * 'Parameters'
184      */
185     addChoiceOfSequence(args);
186
187     // addChoiceOfDatabase(args);
188
189     String thisAlignment = MessageManager
190             .getString(JackHMMER.THIS_ALIGNMENT_KEY);
191     String database = MessageManager.getString("label.database");
192     args.add(new RadioChoiceParameter(
193             MessageManager.getString("action.search"), null,
194             Arrays.asList(thisAlignment, database), thisAlignment));
195     args.add(new FileParameter(database, "", false, "", ""));
196     args.add(new RadioChoiceParameter(
197             MessageManager.getString(JackHMMER.REPORTING_CUTOFF_KEY), null,
198             Arrays.asList(JackHMMER.CUTOFF_NONE, JackHMMER.CUTOFF_EVALUE,
199                     JackHMMER.CUTOFF_SCORE),
200             JackHMMER.CUTOFF_EVALUE));
201     args.add(new LogarithmicParameter(
202             MessageManager.getString(JackHMMER.SEQ_EVALUE_KEY),
203             MessageManager.getString("label.seq_e_value_desc"), false, 1D,
204             1E-38, 10D));
205     args.add(new LogarithmicParameter(
206             MessageManager.getString(JackHMMER.DOM_EVALUE_KEY),
207             MessageManager.getString("label.dom_e_value_desc"), false, 1D,
208             1E-38, 10D));
209     args.add(new DoubleParameter(
210             MessageManager.getString(JackHMMER.SEQ_SCORE_KEY),
211             MessageManager.getString("label.seq_score_desc"), false, 0d, 0d,
212             1000d));
213     args.add(new DoubleParameter(
214             MessageManager.getString(JackHMMER.DOM_SCORE_KEY),
215             MessageManager.getString("label.dom_score_desc"), false, 0d, 0d,
216             1000d));
217   }
218
219   /**
220    * Constructs a choice parameter for database to search; always includes 'this
221    * alignment', and also includes any databases held under user preferences key
222    * "HMMSEARCH_DBS" as a comma-delimited list
223    * 
224    * @param args
225    */
226   protected void addChoiceOfDatabase(List<ArgumentI> args)
227   {
228     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
229     if (names == null || names.isEmpty())
230     {
231       return;
232     }
233
234     List<String> filePaths = new ArrayList<>();
235     List<String> fileNames = new ArrayList<>();
236
237     String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
238     filePaths.add(thisAlignment);
239     fileNames.add(thisAlignment);
240
241     Scanner nameScanner = new Scanner(names);
242     nameScanner.useDelimiter(Preferences.COMMA);
243
244     while (nameScanner.hasNext())
245     {
246       String next = nameScanner.next();
247       if ("null".equals(next))
248       {
249         Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
250       }
251       else
252       {
253         filePaths.add(next);
254         int pos = next.lastIndexOf(File.separator);
255         String fileName = next.substring(pos + 1);
256         fileNames.add(fileName);
257       }
258     }
259     nameScanner.close();
260     ArgumentI databasesOption = new StringParameter(
261             MessageManager.getString(HMMSearch.DATABASE_KEY),
262             MessageManager.getString("label.database_for_hmmsearch"), true,
263             thisAlignment,
264             thisAlignment,
265             filePaths, fileNames);
266     args.add(databasesOption);
267   }
268
269   /**
270    * Answers default parameters for hmmalign, taking into account any configured
271    * as user preferences
272    * 
273    * @param args
274    */
275   private void getHMMAlignParams(List<ArgumentI> args)
276   {
277     addChoiceOfHmm(args);
278
279     boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
280             false);
281     args.add(new BooleanOption(
282             MessageManager.getString("label.trim_termini"),
283             MessageManager.getString("label.trim_termini_desc"),
284             false, false, def, null));
285   }
286
287   /**
288    * Adds an argument representing the choice of HMM sequences (profiles)
289    * against which to perform align or search, provided at least one is found
290    * 
291    * @param args
292    */
293   protected void addChoiceOfHmm(List<ArgumentI> args)
294   {
295     List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
296     if (!hmms.isEmpty())
297     {
298       List<String> options = new ArrayList<>();
299       for (SequenceI hmmSeq : hmms)
300       {
301         options.add(hmmSeq.getName());
302       }
303       String defseq = options.get(0);
304       ArgumentI arg = new StringParameter(
305               MessageManager.getString("label.use_hmm"), null, true, defseq,
306               defseq, options, null);
307       args.add(arg);
308     }
309   }
310
311   /**
312    * Adds an argument representing the choice of sequence against which to perform
313    * jackhmmer
314    * 
315    * @param args
316    */
317   protected void addChoiceOfSequence(List<ArgumentI> args)
318   {
319     List<SequenceI> sequences = viewport.getAlignment().getSequences();
320
321     List<String> options = new ArrayList<>();
322
323     for (SequenceI seq : sequences)
324     {
325       options.add(seq.getName());
326     }
327
328     String defseq = options.get(0);
329     ArgumentI arg = new StringParameter(
330             MessageManager.getString("label.use_sequence"), null, true,
331             defseq,
332             defseq, options, null);
333     args.add(arg);
334   }
335
336   /**
337    * Answers default parameters for hmmbuild, taking into account any configured
338    * as user preferences
339    * 
340    * @param args
341    */
342   private void getHMMBuildParams(List<ArgumentI> args)
343   {
344     /*
345      * name to give the computed alignment HMM consensus sequence
346      * (Jalview constructs group HMM consensus sequence names)
347      */
348     String defValue = "Alignment_HMM";
349     StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
350             MessageManager.getString("label.hmm_name_desc"), true, defValue,
351             defValue);
352     args.add(nameParam);
353
354     /*
355      * only enable Use Reference Annotation if RF is present
356      */
357     if (viewport.hasReferenceAnnotation())
358     {
359       args.add(new BooleanOption(
360               MessageManager.getString("label.use_reference"),
361               MessageManager.getString("label.use_reference_desc"), true,
362               true, true, null));
363     }
364
365     /*
366      * choice of whether to compute HMM for alignment and/or group(s)
367      * - only if there are any groups
368      */
369     if (!viewport.getAlignment().getGroups().isEmpty())
370     {
371       List<String> options = new ArrayList<>();
372       options.add(MessageManager.getString("label.alignment"));
373       options.add(MessageManager.getString("label.groups_and_alignment"));
374       options.add(MessageManager.getString("label.groups"));
375       options.add(MessageManager.getString("label.selected_group"));
376       args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
377               MessageManager.getString("label.hmmbuild_for_desc"), true,
378               MessageManager.getString("label.alignment"),
379               MessageManager.getString("label.alignment"), options, null));
380     }
381   }
382
383   @Override
384   public boolean presetExists(String forName)
385   {
386     return false;
387   }
388
389   @Override
390   public void deletePreset(String forName)
391   {
392   }
393
394   @Override
395   public void storePreset(String presetName, String text,
396           List<ArgumentI> jobParams)
397   {
398   }
399
400   @Override
401   public void updatePreset(String oldName, String presetName, String text,
402           List<ArgumentI> jobParams)
403   {
404   }
405
406   @Override
407   public WsParamSetI parseServiceParameterFile(String forName,
408           String description, String[] serviceURL, String parameters)
409           throws IOException
410   {
411     return null;
412   }
413
414   @Override
415   public String generateServiceParameterFile(WsParamSetI pset)
416           throws IOException
417   {
418     return null;
419   }
420
421 }