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