Update spike branch to latest (HMMSearch file chooser arg)
[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 String name;
36
37   private List<WsParamSetI> presets = new ArrayList<>();
38
39   private AlignmentViewport viewport;
40
41   private HMMERParamStore(String nam, AlignmentViewport av)
42   {
43     this.viewport = av;
44     this.name = nam;
45   }
46
47   public static HMMERParamStore forBuild(AlignmentViewport viewport)
48   {
49     return new HMMERParamStore(HMMBUILD, viewport);
50   }
51
52   public static HMMERParamStore forAlign(AlignmentViewport viewport)
53   {
54     return new HMMERParamStore(HMMALIGN, viewport);
55   }
56
57   public static HMMERParamStore forSearch(AlignmentViewport viewport)
58   {
59     return new HMMERParamStore(HMMSEARCH, viewport);
60   }
61
62   @Override
63   public List<WsParamSetI> getPresets()
64   {
65     return presets;
66   }
67
68   @Override
69   public WsParamSetI getPreset(String nam)
70   {
71     return null;
72   }
73
74   @Override
75   public List<ArgumentI> getServiceParameters()
76   {
77     List<ArgumentI> args = new ArrayList<>();
78     switch (name)
79     {
80     case HMMSEARCH:
81       getHMMSearchParams(args);
82       break;
83     case HMMALIGN:
84       getHMMAlignParams(args);
85       break;
86     case HMMBUILD:
87       getHMMBuildParams(args);
88       break;
89     default:
90     }
91
92     return args;
93   }
94
95   /**
96    * Answers default parameters for hmmsearch, taking into account any
97    * configured as user preferences
98    * 
99    * @param args
100    */
101   private void getHMMSearchParams(List<ArgumentI> args)
102   {
103     /*
104      * 'Options'
105      */
106     args.add(new BooleanOption(
107             MessageManager.getString(HMMSearch.AUTO_ALIGN_SEQS_KEY),
108             MessageManager.getString("label.auto_align_seqs_desc"), false,
109             false, false, null));
110     args.add(new BooleanOption(
111             MessageManager.getString(HMMSearch.USE_ACCESSIONS_KEY),
112             MessageManager.getString("label.use_accessions_desc"), false,
113             false, true, null));
114     args.add(new BooleanOption(
115             MessageManager.getString(HMMSearch.TRIM_TERMINI_KEY),
116             MessageManager.getString("label.trim_termini_desc"), false,
117             false, true, null));
118
119     /*
120      * 'Parameters'
121      */
122     addChoiceOfHmm(args);
123
124     // addChoiceOfDatabase(args);
125
126     String thisAlignment = MessageManager
127             .getString(HMMSearch.THIS_ALIGNMENT_KEY);
128     String database = MessageManager.getString("label.database");
129     args.add(new RadioChoiceParameter(
130             MessageManager.getString("action.search"), null,
131             Arrays.asList(thisAlignment,
132                     database),
133             thisAlignment));
134     args.add(new FileParameter(database, "", false, "", ""));
135     args.add(new IntegerParameter(
136             MessageManager.getString(HMMSearch.NUMBER_OF_RESULTS_KEY),
137             MessageManager.getString("label.number_of_results_desc"), true,
138             100, 0, 100000));
139     args.add(new RadioChoiceParameter(
140             MessageManager.getString(HMMSearch.REPORTING_CUTOFF_KEY), null,
141             Arrays.asList(HMMSearch.CUTOFF_NONE, HMMSearch.CUTOFF_EVALUE,
142                     HMMSearch.CUTOFF_SCORE),
143             HMMSearch.CUTOFF_EVALUE));
144     args.add(new LogarithmicParameter(
145             MessageManager.getString(HMMSearch.SEQ_EVALUE_KEY),
146             MessageManager.getString("label.seq_e_value_desc"), false, 1D,
147             1E-38, 10D));
148     args.add(new LogarithmicParameter(
149             MessageManager.getString(HMMSearch.DOM_EVALUE_KEY),
150             MessageManager.getString("label.dom_e_value_desc"), false, 1D,
151             1E-38, 10D));
152     args.add(
153             new DoubleParameter(
154                     MessageManager.getString(HMMSearch.SEQ_SCORE_KEY),
155                     MessageManager.getString("label.seq_score_desc"), false,
156                     0d, 0d, 1000d));
157     args.add(
158             new DoubleParameter(
159                     MessageManager.getString(HMMSearch.DOM_SCORE_KEY),
160                     MessageManager.getString("label.dom_score_desc"), false,
161                     0d, 0d, 1000d));
162   }
163
164   /**
165    * Constructs a choice parameter for database to search; always includes 'this
166    * alignment', and also includes any databases held under user preferences key
167    * "HMMSEARCH_DBS" as a comma-delimited list
168    * 
169    * @param args
170    */
171   protected void addChoiceOfDatabase(List<ArgumentI> args)
172   {
173     String names = Cache.getProperty(Preferences.HMMSEARCH_DBS);
174     if (names == null || names.isEmpty())
175     {
176       return;
177     }
178
179     List<String> filePaths = new ArrayList<>();
180     List<String> fileNames = new ArrayList<>();
181
182     String thisAlignment = MessageManager.getString(HMMSearch.THIS_ALIGNMENT_KEY);
183     filePaths.add(thisAlignment);
184     fileNames.add(thisAlignment);
185
186     Scanner nameScanner = new Scanner(names);
187     nameScanner.useDelimiter(Preferences.COMMA);
188
189     while (nameScanner.hasNext())
190     {
191       String next = nameScanner.next();
192       if ("null".equals(next))
193       {
194         Cache.setProperty(Preferences.HMMSEARCH_DBS, "");
195       }
196       else
197       {
198         filePaths.add(next);
199         int pos = next.lastIndexOf(File.separator);
200         String fileName = next.substring(pos + 1);
201         fileNames.add(fileName);
202       }
203     }
204     nameScanner.close();
205     ArgumentI databasesOption = new StringParameter(
206             MessageManager.getString(HMMSearch.DATABASE_KEY),
207             MessageManager.getString("label.database_for_hmmsearch"), true,
208             thisAlignment,
209             thisAlignment,
210             filePaths, fileNames);
211     args.add(databasesOption);
212   }
213
214   /**
215    * Answers default parameters for hmmalign, taking into account any configured
216    * as user preferences
217    * 
218    * @param args
219    */
220   private void getHMMAlignParams(List<ArgumentI> args)
221   {
222     addChoiceOfHmm(args);
223
224     boolean def = Cache.getDefault(Preferences.HMMALIGN_TRIM_TERMINI,
225             false);
226     args.add(new BooleanOption(
227             MessageManager.getString("label.trim_termini"),
228             MessageManager.getString("label.trim_termini_desc"),
229             false, false, def, null));
230   }
231
232   /**
233    * Adds an argument representing the choice of HMM sequences (profiles)
234    * against which to perform align or search, provided at least one is found
235    * 
236    * @param args
237    */
238   protected void addChoiceOfHmm(List<ArgumentI> args)
239   {
240     List<SequenceI> hmms = viewport.getAlignment().getHmmSequences();
241     if (!hmms.isEmpty())
242     {
243       List<String> options = new ArrayList<>();
244       for (SequenceI hmmSeq : hmms)
245       {
246         options.add(hmmSeq.getName());
247       }
248       String defseq = options.get(0);
249       ArgumentI arg = new StringParameter(
250               MessageManager.getString("label.use_hmm"), null, true, defseq,
251               defseq, options, null);
252       args.add(arg);
253     }
254   }
255
256   /**
257    * Answers default parameters for hmmbuild, taking into account any configured
258    * as user preferences
259    * 
260    * @param args
261    */
262   private void getHMMBuildParams(List<ArgumentI> args)
263   {
264     /*
265      * name to give the computed alignment HMM consensus sequence
266      * (Jalview constructs group HMM consensus sequence names)
267      */
268     String defValue = "Alignment_HMM";
269     StringParameter nameParam = new StringParameter(MessageManager.getString("label.hmm_name"),
270             MessageManager.getString("label.hmm_name_desc"), true, defValue,
271             defValue);
272     args.add(nameParam);
273
274     /*
275      * only enable Use Reference Annotation if RF is present
276      */
277     if (viewport.hasReferenceAnnotation())
278     {
279       args.add(new BooleanOption(
280               MessageManager.getString("label.use_reference"),
281               MessageManager.getString("label.use_reference_desc"), true,
282               true, true, null));
283     }
284
285     /*
286      * choice of whether to compute HMM for alignment and/or group(s)
287      * - only if there are any groups
288      */
289     if (!viewport.getAlignment().getGroups().isEmpty())
290     {
291       List<String> options = new ArrayList<>();
292       options.add(MessageManager.getString("label.alignment"));
293       options.add(MessageManager.getString("label.groups_and_alignment"));
294       options.add(MessageManager.getString("label.groups"));
295       options.add(MessageManager.getString("label.selected_group"));
296       args.add(new Option(MessageManager.getString("label.hmmbuild_for"),
297               MessageManager.getString("label.hmmbuild_for_desc"), true,
298               MessageManager.getString("label.alignment"),
299               MessageManager.getString("label.alignment"), options, null));
300     }
301   }
302
303   @Override
304   public boolean presetExists(String forName)
305   {
306     return false;
307   }
308
309   @Override
310   public void deletePreset(String forName)
311   {
312   }
313
314   @Override
315   public void storePreset(String presetName, String text,
316           List<ArgumentI> jobParams)
317   {
318   }
319
320   @Override
321   public void updatePreset(String oldName, String presetName, String text,
322           List<ArgumentI> jobParams)
323   {
324   }
325
326   @Override
327   public WsParamSetI parseServiceParameterFile(String forName,
328           String description, String[] serviceURL, String parameters)
329           throws IOException
330   {
331     return null;
332   }
333
334   @Override
335   public String generateServiceParameterFile(WsParamSetI pset)
336           throws IOException
337   {
338     return null;
339   }
340
341 }