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