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